Collaborators: Shane Blowes, Jon Chase, Helmut Hillebrand, Michael Burrows, Amanda Bates, Uli Brose, Benoit Gauzens, Laura Antao, Ruben Remelgado, Carsten Meyer, Myriam Hirt, maybe others Assistance: Katherine Lew, Josef Hauser

Introduction

Methods

library(data.table) # for handling large datasets
library(ggplot2) # for some plotting
library(nlme) # for ME models
library(maps) # for map
library(gridExtra) # to combine ggplots together
library(grid) # to combine ggplots together
library(RColorBrewer)
library(MASS) # for stepAIC

options(width=500) # turn off most text wrapping

# tell RStudio to use project root directory as the root for this notebook. Needed since we are storing code in a separate directory.
knitr::opts_knit$set(root.dir = rprojroot::find_rstudio_root_file()) 
# Turnover and covariates assembled by turnover_vs_temperature_prep.Rmd
trends <- fread('output/turnover_w_covariates.csv.gz')

# set realm order
trends[, REALM := factor(REALM, levels = c('Freshwater', 'Marine', 'Terrestrial'), ordered = FALSE)]

# set up sign of temperature change
trends[, tsign := factor(sign(temptrend))]

# realm that combined Terrestrial and Freshwater, for interacting with human impact
trends[, REALM2 := REALM]
levels(trends$REALM2) = list(TerrFresh = "Freshwater", TerrFresh = "Terrestrial", Marine = "Marine")

# group Marine invertebrates/plants in with All
trends[, taxa_mod2 := taxa_mod]
trends[taxa_mod == 'Marine invertebrates/plants', taxa_mod2 := 'All']

# calculate duration
trends[, duration := maxyrBT - minyrBT + 1]

# trim to data with >= 3 yrs
trends <- trends[nyrBT >= 3, ]

Log-transform some variables, then center and scale.

trends[, tempave.sc := scale(tempave)]
trends[, tempave_metab.sc := scale(tempave_metab)]
trends[, seas.sc := scale(seas)]
trends[, microclim.sc := scale(log(microclim))]
trends[, temptrend.sc := scale(temptrend, center = FALSE)] # do not center
trends[, temptrend_abs.sc := scale(abs(temptrend), center = FALSE)] # do not center, so that 0 is still 0 temperature change
trends[, mass.sc := scale(log(mass_mean_weight))]
trends[, speed.sc := scale(log(speed_mean_weight+1))]
trends[, lifespan.sc := scale(log(lifespan_mean_weight))]
trends[, consumerfrac.sc := scale(consfrac)]
trends[, endothermfrac.sc := scale(endofrac)]
trends[, nspp.sc := scale(log(Nspp))]
trends[, thermal_bias.sc := scale(thermal_bias)]
trends[, npp.sc := scale(log(npp))]
trends[, veg.sc := scale(log(veg+1))]
trends[, duration.sc := scale(log(duration))]
trends[, human_bowler.sc := scale(log(human_bowler+1)), by = REALM2] # separate scaling by realm
trends[REALM2 == 'TerrFresh', human_footprint.sc := scale(log(human_venter+1))]
trends[REALM2 == 'Marine', human_footprint.sc := scale(log(human_halpern))]

Examine how many data points are available

Just turnover

cat('Overall # time-series: ', nrow(trends), '\n')
Overall # time-series:  39195 
cat('# studies: ', trends[, length(unique(STUDY_ID))], '\n')
# studies:  307 
cat('Data points: ', trends[, sum(nyrBT)], '\n')
Data points:  266337 
trends[, table(REALM)]
REALM
 Freshwater      Marine Terrestrial 
        628       35742        2825 
trends[, table(taxa_mod)]
taxa_mod
                        All                  Amphibians                     Benthos                       Birds 
                       1447                         352                        4310                        8719 
                       Fish               Invertebrates                     Mammals Marine invertebrates/plants 
                      21708                        1799                         504                         104 
                      Plant                    Reptiles 
                        248                           4 
trends[, table(taxa_mod, REALM)]
                             REALM
taxa_mod                      Freshwater Marine Terrestrial
  All                                  0   1444           3
  Amphibians                           2      0         350
  Benthos                              0   4310           0
  Birds                                0   6542        2177
  Fish                               610  21098           0
  Invertebrates                       14   1705          80
  Mammals                              0    459          45
  Marine invertebrates/plants          0    104           0
  Plant                                1     80         167
  Reptiles                             1      0           3

With all covariates (Bowler for human)

# the cases we can compare
apply(trends[, .(Jtutrendrem0, REALM, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, temptrend.sc, mass.sc, speed.sc, lifespan.sc, consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, veg.sc, human_bowler.sc)], MARGIN = 2, FUN = function(x) sum(!is.na(x)))
    Jtutrendrem0            REALM       tempave.sc tempave_metab.sc          seas.sc     microclim.sc 
           39195            39195            36747            36747            36747            38291 
    temptrend.sc          mass.sc         speed.sc      lifespan.sc  consumerfrac.sc endothermfrac.sc 
           36747            39114            39082            38045            39195            39195 
         nspp.sc  thermal_bias.sc           npp.sc           veg.sc  human_bowler.sc 
           39195            36286            39089            39099            39195 
i <- trends[, complete.cases(Jtutrendrem0, tempave.sc, tempave_metab.sc, seas.sc, microclim.sc, temptrend.sc, mass.sc, speed.sc, lifespan.sc, consumerfrac.sc, endothermfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, veg.sc, human_bowler.sc)]
cat('Overall # time-series: ', sum(i), '\n')
Overall # time-series:  36017 
cat('# studies: ', trends[i, length(unique(STUDY_ID))], '\n')
# studies:  231 
cat('Data points: ', trends[i, sum(nyrBT)], '\n')
Data points:  243237 
trends[i, table(REALM)]
REALM
 Freshwater      Marine Terrestrial 
        608       33098        2311 
trends[i, table(taxa_mod)]
taxa_mod
                        All                  Amphibians                     Benthos                       Birds 
                       1422                          12                        4288                        7198 
                       Fish               Invertebrates                     Mammals Marine invertebrates/plants 
                      20810                        1517                         495                         104 
                      Plant                    Reptiles 
                        169                           2 
trends[i, table(taxa_mod, REALM)]
                             REALM
taxa_mod                      Freshwater Marine Terrestrial
  All                                  0   1420           2
  Amphibians                           2      0          10
  Benthos                              0   4288           0
  Birds                                0   5116        2082
  Fish                               597  20213           0
  Invertebrates                        8   1443          66
  Mammals                              0    459          36
  Marine invertebrates/plants          0    104           0
  Plant                                1     55         113
  Reptiles                             0      0           2

Choose the variance structure for mixed effects models

Try combinations of

  • variance scaled to a power of the number of years in the community time-series
  • variance scaled to a power of the abs temperature trend
  • random intercept for taxa_mod
  • random intercept for STUDY_ID
  • random slope (abs temperature trend) for taxa_mod
  • random slope (abs temperature trend) for STUDY_ID
  • random intercept for rarefyID (for overdispersion)

And choose the one with lowest AIC (not run: takes a long time)

# fit models for variance structure
fixed <- formula(Jtutrendrem0 ~ temptrend_abs.sc*REALM +
                     temptrend_abs.sc*tsign + 
                     temptrend_abs.sc*tempave_metab.sc + 
                     temptrend_abs.sc*seas.sc + 
                     temptrend_abs.sc*microclim.sc + 
                     temptrend_abs.sc*mass.sc + 
                     temptrend_abs.sc*speed.sc + 
                     temptrend_abs.sc*consumerfrac.sc +
                     temptrend_abs.sc*nspp.sc +
                     temptrend_abs.sc*thermal_bias.sc:tsign +
                     temptrend_abs.sc*npp.sc +
                     temptrend_abs.sc*veg.sc +
                     temptrend_abs.sc*duration.sc +
                     temptrend_abs.sc*human_bowler.sc:REALM2)
i <- trends[, complete.cases(Jtutrendrem0, temptrend_abs.sc, REALM, tsign, tempave_metab.sc, seas.sc, 
                             microclim.sc, mass.sc, speed.sc, consumerfrac.sc, nspp.sc,
                             thermal_bias.sc, npp.sc, veg.sc, human_bowler.sc)]
mods <- vector('list', 0)
mods[[1]] <- gls(fixed, data = trends[i,])
mods[[2]] <- gls(fixed, data = trends[i,], weights = varPower(-0.5, ~nyrBT))
mods[[3]] <- gls(fixed, data = trends[i,], weights = varPower(0.5, ~temptrend_abs.sc))

mods[[4]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2, control = lmeControl(opt = "optim"))
mods[[5]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID, control = lmeControl(opt = "optim"))
mods[[6]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID, control = lmeControl(opt = "optim"))
mods[[7]] <- lme(fixed, data = trends[i,], random = ~1|STUDY_ID/rarefyID, control = lmeControl(opt = "optim"))
mods[[8]] <- lme(fixed, data = trends[i,], random = ~1|taxa_mod2/STUDY_ID/rarefyID, control = lmeControl(opt = "optim"))

mods[[9]] <- lme(fixed, data = trends[i,], random = ~temptrend_abs.sc | taxa_mod)
mods[[10]] <- lme(fixed, data = trends[i,], random = list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)) # includes overdispersion. new formula so that random slope is only for study level (not enough data to extend to rarefyID).

mods[[11]] <- lme(fixed, data = trends[i,], random = list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1), weights = varPower(-0.5, ~nyrBT))
mods[[12]] <- lme(fixed, data = trends[i,], random = list(taxa_mod2 = ~ temptrend_abs.sc, STUDY_ID = ~ 1, rarefyID = ~1), weights = varPower(-0.5, ~nyrBT))

aics <- sapply(mods, AIC)
minaics <- aics - min(aics)
minaics
which.min(aics)

Chooses the random slopes (temptrend_abs) & intercepts for STUDY_ID, overdispersion, and variance scaled to number of years. We haven’t dealt with potential testing on the boundary issues here yet.

Results

Where do we have data?

world <- map_data('world')
ggplot(world, aes(x = long, y = lat, group = group)) +
    geom_polygon(fill = 'lightgray', color = 'white') +
    geom_point(data = trends, aes(rarefyID_x, rarefyID_y, group = REALM, color = REALM), size = 0.5, alpha = 0.4)  +
    scale_color_brewer(palette="Set1", name = 'Realm') +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.key=element_blank(),
        axis.text=element_text(size=16),
        axis.title=element_text(size=20)) +
  labs(x = 'Longitude (°)', y = 'Latitude (°)')

Mostly northern hemisphere, but spread all over. Not so much in Africa or much of Asia.

Average rates of turnover (without year 1)

trends[abs(temptrend) >= 0.5, .(ave = mean(Jtutrendrem0, na.rm=TRUE), 
                                sd = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N))] # turnover per year for locations changing temperature
trends[abs(temptrend) < 0.1, .(ave = mean(Jtutrendrem0, na.rm=TRUE), 
                               sd = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N))] # not changing temperature
trends[temptrend >= 0.5, .(ave = mean(Jtutrendrem0, na.rm=TRUE), 
                           sd = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N))] # warming
trends[temptrend <= -0.5, .(ave = mean(Jtutrendrem0, na.rm=TRUE), 
                            sd = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N))] # cooling

trends[abs(temptrend) >= 0.5 & abs(rarefyID_y) < 35, 
       .(ave = mean(Jtutrendrem0, na.rm=TRUE), 
         sd = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N))] # tropics and sub-tropics
trends[abs(temptrend) >= 0.5 & abs(rarefyID_y) >= 35 & abs(rarefyID_y) < 66.56339, 
       .(ave = mean(Jtutrendrem0, na.rm=TRUE), 
         sd = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N))] # temperate
trends[abs(temptrend) >= 0.5 & abs(rarefyID_y) >= 66.56339, 
       .(ave = mean(Jtutrendrem0, na.rm=TRUE), 
         sd = sd(Jtutrendrem0, na.rm=TRUE)/sqrt(.N))] # arctic

Temperature-only model (Jtutrend, Jbetatrend, Horntrend)

i4 <- trends[, complete.cases(Jtutrendrem0, REALM, temptrend)]

randef <- list(STUDY_ID = ~ abs(temptrend), rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

if(file.exists('temp/modonlyTtrendrem0.rds')){
  modonlyTtrendrem0 <- readRDS('temp/modonlyTtrendrem0.rds')
} else {
  modonlyTtrendrem0 <- lme(Jtutrendrem0 ~ abs(temptrend)*REALM,
                   random = randef, weights = varef, data = trends[i4,], method = 'REML')
  saveRDS(modonlyTtrendrem0, file = 'temp/modonlyTtrendrem0.rds')
}

i5 <- trends[, complete.cases(Jbetatrendrem0, REALM, temptrend)]
if(file.exists('temp/modonlyTtrendJbetarem0.rds')){
  modonlyTtrendJbetarem0 <- readRDS('temp/modonlyTtrendJbetarem0.rds')
} else {
  modonlyTtrendJbetarem0 <- lme(Jbetatrendrem0 ~ abs(temptrend)*REALM,
                   random = randef, weights = varef, data = trends[i5,], method = 'REML', 
                   control=lmeControl(msMaxIter = 100, maxIter = 100))
  saveRDS(modonlyTtrendJbetarem0, file = 'temp/modonlyTtrendJbetarem0.rds')
}

i6 <- trends[, complete.cases(Horntrendrem0, REALM, temptrend)]
if(file.exists('temp/modonlyTtrendHornrem0.rds')){
  modonlyTtrendHornrem0 <- readRDS('temp/modonlyTtrendHornrem0.rds')
} else {
  modonlyTtrendHornrem0 <- lme(Horntrendrem0 ~ abs(temptrend)*REALM,
                   random = randef, weights = varef, data = trends[i6,], method = 'REML')
  saveRDS(modonlyTtrendHornrem0, file = 'temp/modonlyTtrendHornrem0.rds')
}

summary(modonlyTtrendrem0)
Linear mixed-effects model fit by REML
 Data: trends[i4, ] 

Random effects:
 Formula: ~abs(temptrend) | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
               StdDev      Corr  
(Intercept)    0.007657053 (Intr)
abs(temptrend) 0.197650298 -0.935

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01097849 2.000161

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.121022 
Fixed effects: Jtutrendrem0 ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.807                                
REALMMarine                     -0.947  0.764                         
REALMTerrestrial                -0.901  0.727  0.853                  
abs(temptrend):REALMMarine       0.766 -0.949 -0.814 -0.690           
abs(temptrend):REALMTerrestrial  0.733 -0.908 -0.693 -0.810  0.862    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-6.57101792 -0.22892007 -0.01904447  0.27434430  5.64177564 

Number of Observations: 36747
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   292                  36747 
summary(modonlyTtrendJbetarem0)
Linear mixed-effects model fit by REML
 Data: trends[i5, ] 

Random effects:
 Formula: ~abs(temptrend) | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
               StdDev      Corr  
(Intercept)    0.005965236 (Intr)
abs(temptrend) 0.160013131 -0.038

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.003861919 0.9688156

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.887978 
Fixed effects: Jbetatrendrem0 ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.543                                
REALMMarine                     -0.941  0.511                         
REALMTerrestrial                -0.906  0.492  0.852                  
abs(temptrend):REALMMarine       0.515 -0.948 -0.524 -0.467           
abs(temptrend):REALMTerrestrial  0.494 -0.908 -0.464 -0.542  0.861    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-8.57430409 -0.30896466 -0.02462766  0.32539894  8.23224466 

Number of Observations: 36747
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   292                  36747 
summary(modonlyTtrendHornrem0)
Linear mixed-effects model fit by REML
 Data: trends[i6, ] 

Random effects:
 Formula: ~abs(temptrend) | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
               StdDev     Corr  
(Intercept)    0.01201968 (Intr)
abs(temptrend) 0.25314398 0.016 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01882813 2.441788

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.318769 
Fixed effects: Horntrendrem0 ~ abs(temptrend) * REALM 
 Correlation: 
                                (Intr) abs(t) REALMM REALMT a():REALMM
abs(temptrend)                  -0.472                                
REALMMarine                     -0.944  0.446                         
REALMTerrestrial                -0.899  0.424  0.848                  
abs(temptrend):REALMMarine       0.447 -0.945 -0.455 -0.401           
abs(temptrend):REALMTerrestrial  0.428 -0.906 -0.404 -0.473  0.856    

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.75457482 -0.22483445 -0.02254226  0.23615730  5.73488343 

Number of Observations: 36005
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   257                  36005 

Plot the temp-only coefficients

colors <- brewer.pal(3, 'Dark2')

# make table of coefficients
coefs1 <- as.data.frame(summary(modonlyTtrendrem0)$tTable)
coefs2 <- as.data.frame(summary(modonlyTtrendJbetarem0)$tTable)
coefs3 <- as.data.frame(summary(modonlyTtrendHornrem0)$tTable)
coefs1$mod <- 'Jtu'
coefs2$mod <- 'Jbeta'
coefs3$mod <- 'Horn'
rows1 <- which(grepl('temptrend', rownames(coefs1))) # extract temperature effect
cols <- c('Value', 'Std.Error', 'mod')
allcoefs <- rbind(coefs1[rows1, cols], coefs2[rows1, cols], coefs3[rows1, cols])
allcoefs$Value[grepl('REALMMarine', rownames(allcoefs))] <- 
  allcoefs$Value[grepl('REALMMarine', rownames(allcoefs))] + 
  allcoefs$Value[!grepl('REALM', rownames(allcoefs))] # add intercept to marine effects
allcoefs$Value[grepl('REALMTerrestrial', rownames(allcoefs))] <- 
  allcoefs$Value[grepl('REALMTerrestrial', rownames(allcoefs))] + 
  allcoefs$Value[!grepl('REALM', rownames(allcoefs))] # add intercept to terrestrial effects

allcoefs$lCI <- allcoefs$Value - allcoefs$Std.Error # lower confidence interval
allcoefs$uCI <- allcoefs$Value + allcoefs$Std.Error
allcoefs$y <- c(3, 2, 1) + rep(c(0, -0.1, -0.2), c(3, 3, 3)) # y-values
allcoefs$col <- c(rep(colors[1], 3), rep(colors[2], 3), rep(colors[3], 3))
allcoefs$realm <- rep(c('Freshwater', 'Marine', 'Terrestrial'), 3)

par(las = 1, mai = c(0.8, 2, 0.1, 0.1))
plot(0,0, col = 'white', xlim=c(-0.1, 0.85), ylim = c(0.5,3), 
     yaxt='n', xlab = 'Turnover per |°C/yr|', ylab ='')
axis(2, at = 3:1, labels = c('Freshwater', 'Marine', 'Terrestrial'), cex.axis = 0.7)
abline(v = 0, col = 'grey')
for(i in 1:nrow(allcoefs)){
  with(allcoefs[i, ], points(Value, y, pch = 16, col = col))
  with(allcoefs[i, ], lines(x = c(lCI, uCI), y = c(y, y), col = col))
}
legend('bottomright', col = colors, lwd = 1, pch = 16, 
       legend = c('Jaccard turnover', 'Jaccard total', 'Horn-Morisita',
                  'Jaccard turnover rem0', 'Jaccard total rem0', 'Horn-Morisita rem0'))

Nicer plots of turnover vs. temperature data

Violin plots

# on macbook: fig.width=3, fig.height=2.375, fig.retina=3, out.width=3, out.height=2.375
# on external monitor: fig.width=6, fig.height=4.5
trends[temptrend <= -0.7, temptrendtext := 'Cooling']
trends[abs(temptrend) <= 0.05, temptrendtext := 'Stable']
trends[temptrend >= 0.7, temptrendtext := 'Warming']

trends[abs(rarefyID_y) < 35, latzone := 'Subtropics']
trends[abs(rarefyID_y) >= 35 & abs(rarefyID_x) < 66.56339, latzone := 'Temperate'] 
trends[abs(rarefyID_y) >= 66.56339, latzone := 'Polar']

p1 <- ggplot(trends[!is.na(temptrendtext), ], aes(temptrendtext, Horntrendrem0)) +
  geom_violin(draw_quantiles = c(0.25, 0.5, 0.75), fill = 'grey') +
  labs(x = '', y = 'Turnover', tag = 'A', title = 'Rate of temperature change') +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.key=element_blank(),
        axis.text=element_text(size=8),
        axis.title=element_text(size=10))

p2 <- ggplot(trends[abs(temptrend) >= 0.1 & !is.na(latzone), ], aes(latzone, Horntrendrem0)) +
  geom_violin(draw_quantiles = c(0.25, 0.5, 0.75), fill = 'grey') + 
  labs(x = '', y = '', tag = 'C', title = 'Warming regions') +
  theme(panel.grid.major = element_blank(), panel.grid.minor = element_blank(),
        panel.background = element_blank(), axis.line = element_line(colour = "black"),
        legend.key=element_blank(),
        axis.text=element_text(size=7),
        axis.title=element_text(size=10))


grid.arrange(p1, p2, ncol = 2)

Full models

Try static covariates plus interactions of abs temperature trend with each covariate:

  • realm
  • speed
  • mass
  • average metabolic temperature
  • consumer fraction
  • environmental temperature
  • seasonality
  • microclimates
  • thermal bias
  • NPP
  • vegetation
  • duration
  • human footprint

Except for thermal bias: interact with temperature trend (not abs)

Fit full models

Bowler vs Venter/Halpern human impact

Bowler has lower AIC.

Full models

i1 <- trends[, complete.cases(Jtutrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]
i2 <- trends[, complete.cases(Jbetatrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]
i3 <- trends[, complete.cases(Horntrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]

randef <- list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

# full models
if(file.exists('temp/modTfullJturem0.rds')){
  modTfullJturem0 <- readRDS('temp/modTfullJturem0.rds')
} else {
  modTfullJturem0 <- lme(Jtutrendrem0 ~ temptrend_abs.sc*REALM + 
                         temptrend_abs.sc*tsign +
                         temptrend_abs.sc*tempave_metab.sc + 
                         temptrend_abs.sc*seas.sc + 
                         temptrend_abs.sc*microclim.sc + 
                         temptrend_abs.sc*mass.sc + 
                         temptrend_abs.sc*speed.sc + 
                         temptrend_abs.sc*consumerfrac.sc +
                         temptrend_abs.sc*nspp.sc +
                         temptrend_abs.sc*thermal_bias.sc:tsign +
                         temptrend_abs.sc*npp.sc +
                         temptrend_abs.sc*veg.sc +
                         temptrend_abs.sc*duration.sc +
                         temptrend_abs.sc*human_bowler.sc:REALM2,
                       random = randef, weights = varef, data = trends[i2,], method = 'REML')
  saveRDS(modTfullJturem0, file = 'temp/modTfullJturem0.rds')
}

if(file.exists('temp/modTfullJbetarem0.rds')){
  modTfullJbetarem0 <- readRDS('temp/modTfullJbetarem0.rds')
} else {
  modTfullJbetarem0 <- lme(Jbetatrendrem0 ~ temptrend_abs.sc*REALM + 
                         temptrend_abs.sc*tsign +
                         temptrend_abs.sc*tempave_metab.sc + 
                         temptrend_abs.sc*seas.sc + 
                         temptrend_abs.sc*microclim.sc + 
                         temptrend_abs.sc*mass.sc + 
                         temptrend_abs.sc*speed.sc + 
                         temptrend_abs.sc*consumerfrac.sc +
                         temptrend_abs.sc*nspp.sc +
                         temptrend_abs.sc*thermal_bias.sc:tsign +
                         temptrend_abs.sc*npp.sc +
                         temptrend_abs.sc*veg.sc +
                         temptrend_abs.sc*duration.sc +
                         temptrend_abs.sc*human_bowler.sc:REALM2,
                       random = randef, weights = varef, data = trends[i2,], method = 'REML')
  saveRDS(modTfullJbetarem0, file = 'temp/modTfullJbetarem0.rds')
}

if(file.exists('temp/modTfullHornrem0.rds')){
  modTfullHornrem0 <- readRDS('temp/modTfullHornrem0.rds')
} else {
  modTfullHornrem0 <- lme(Horntrendrem0 ~ temptrend_abs.sc*REALM + 
                        temptrend_abs.sc*tsign +
                        temptrend_abs.sc*tempave_metab.sc + 
                        temptrend_abs.sc*seas.sc + 
                        temptrend_abs.sc*microclim.sc + 
                        temptrend_abs.sc*mass.sc + 
                        temptrend_abs.sc*speed.sc + 
                        temptrend_abs.sc*consumerfrac.sc +
                        temptrend_abs.sc*nspp.sc +
                        temptrend_abs.sc*thermal_bias.sc:tsign +
                        temptrend_abs.sc*npp.sc +
                        temptrend_abs.sc*veg.sc +
                        temptrend_abs.sc*duration.sc +
                        temptrend_abs.sc*human_bowler.sc:REALM2,
                      random = randef, weights = varef, data = trends[i3,], method = 'REML')
  saveRDS(modTfullHornrem0, file = 'temp/modTfullHornrem0.rds')
}

summary(modTfullJturem0)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev      Corr  
(Intercept)      0.009402743 (Intr)
temptrend_abs.sc 0.024575808 -0.966

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01091239 2.006389

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.129145 
Fixed effects: Jtutrendrem0 ~ temptrend_abs.sc * REALM + temptrend_abs.sc *      tsign + temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      consumerfrac.sc + temptrend_abs.sc * nspp.sc + temptrend_abs.sc *      thermal_bias.sc:tsign + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      veg.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. REALMM REALMT tsign1 tmpv_. ses.sc mcrcl. mss.sc
temptrend_abs.sc                                 -0.797                                                        
REALMMarine                                      -0.955  0.757                                                 
REALMTerrestrial                                 -0.683  0.574  0.634                                          
tsign1                                           -0.095  0.063  0.007  0.012                                   
tempave_metab.sc                                  0.061 -0.037 -0.053 -0.242  0.074                            
seas.sc                                          -0.150  0.143  0.202 -0.097 -0.070  0.138                     
microclim.sc                                     -0.068  0.047  0.077  0.006  0.015 -0.157  0.097              
mass.sc                                           0.061 -0.042 -0.036 -0.038 -0.019  0.100  0.127 -0.001       
speed.sc                                          0.107 -0.093 -0.057 -0.084 -0.073 -0.194 -0.055  0.070 -0.437
consumerfrac.sc                                  -0.028  0.022  0.017  0.133  0.014 -0.135 -0.055  0.017  0.016
nspp.sc                                           0.020  0.000 -0.074 -0.066  0.049 -0.154 -0.037 -0.113 -0.010
npp.sc                                            0.041 -0.044 -0.061  0.054  0.041  0.037 -0.136 -0.187 -0.027
veg.sc                                           -0.578  0.387  0.599  0.024 -0.006  0.007  0.080 -0.010  0.021
duration.sc                                      -0.037  0.008  0.032  0.016 -0.160  0.085 -0.006 -0.016 -0.057
temptrend_abs.sc:REALMMarine                      0.764 -0.951 -0.804 -0.534 -0.014  0.030 -0.184 -0.056  0.020
temptrend_abs.sc:REALMTerrestrial                 0.542 -0.693 -0.499 -0.820 -0.018  0.182  0.078  0.024  0.033
temptrend_abs.sc:tsign1                           0.067 -0.140 -0.022 -0.014 -0.507 -0.056  0.012 -0.006 -0.005
temptrend_abs.sc:tempave_metab.sc                -0.037  0.042  0.028  0.171 -0.058 -0.788 -0.106  0.091 -0.066
temptrend_abs.sc:seas.sc                          0.145 -0.158 -0.183  0.095  0.053 -0.100 -0.777 -0.099 -0.081
temptrend_abs.sc:microclim.sc                     0.038 -0.062 -0.047  0.020 -0.014  0.088 -0.068 -0.760  0.028
temptrend_abs.sc:mass.sc                         -0.040  0.048  0.010  0.020 -0.002 -0.086 -0.066  0.019 -0.701
temptrend_abs.sc:speed.sc                        -0.084  0.104  0.040  0.073  0.069  0.167  0.031 -0.041  0.266
temptrend_abs.sc:consumerfrac.sc                  0.030 -0.037 -0.018 -0.117 -0.007  0.105  0.038  0.009  0.006
temptrend_abs.sc:nspp.sc                          0.009  0.008  0.038  0.037 -0.033  0.143  0.035  0.069  0.033
tsign-1:thermal_bias.sc                           0.061 -0.041 -0.057 -0.046 -0.078  0.132 -0.217 -0.015 -0.043
tsign1:thermal_bias.sc                            0.095 -0.074 -0.103 -0.097  0.063  0.223 -0.330 -0.100 -0.043
temptrend_abs.sc:npp.sc                          -0.039  0.065  0.059 -0.051 -0.028 -0.007  0.116  0.168 -0.004
temptrend_abs.sc:veg.sc                           0.411 -0.507 -0.431  0.022 -0.008 -0.018 -0.115  0.003 -0.018
                                                 spd.sc cnsmr. nspp.s npp.sc veg.sc drtn.s t_.:REALMM t_.:REALMT
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tsign1                                                                                                          
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
consumerfrac.sc                                  -0.144                                                         
nspp.sc                                           0.184  0.094                                                  
npp.sc                                            0.125 -0.045 -0.188                                           
veg.sc                                           -0.019 -0.010  0.024 -0.178                                    
duration.sc                                      -0.009  0.005 -0.252  0.062 -0.012                             
temptrend_abs.sc:REALMMarine                      0.047 -0.015  0.046  0.064 -0.406 -0.018                      
temptrend_abs.sc:REALMTerrestrial                 0.068 -0.104  0.025 -0.047  0.019 -0.005  0.639               
temptrend_abs.sc:tsign1                           0.041 -0.007 -0.029 -0.038 -0.018  0.031  0.044      0.011    
temptrend_abs.sc:tempave_metab.sc                 0.134  0.116  0.154 -0.031 -0.012 -0.031 -0.027     -0.228    
temptrend_abs.sc:seas.sc                          0.032  0.029  0.038  0.123 -0.109 -0.027  0.207     -0.162    
temptrend_abs.sc:microclim.sc                    -0.055  0.002  0.074  0.183  0.006  0.011  0.077     -0.051    
temptrend_abs.sc:mass.sc                          0.315  0.008  0.031 -0.007 -0.007  0.044 -0.014     -0.004    
temptrend_abs.sc:speed.sc                        -0.717  0.085 -0.165 -0.064 -0.006  0.001 -0.055     -0.094    
temptrend_abs.sc:consumerfrac.sc                  0.120 -0.773 -0.069  0.022  0.005 -0.035  0.021      0.127    
temptrend_abs.sc:nspp.sc                         -0.159 -0.046 -0.749  0.118 -0.037  0.195 -0.070     -0.068    
tsign-1:thermal_bias.sc                          -0.006 -0.001 -0.035  0.001 -0.012  0.083  0.050      0.034    
tsign1:thermal_bias.sc                           -0.009 -0.024 -0.044 -0.057  0.000  0.084  0.073      0.084    
temptrend_abs.sc:npp.sc                          -0.064  0.004  0.113 -0.741  0.143 -0.043 -0.103      0.085    
temptrend_abs.sc:veg.sc                           0.010  0.011 -0.024  0.173 -0.733  0.003  0.537     -0.033    
                                                 tm_.:1 tm_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                   
REALMMarine                                                                                        
REALMTerrestrial                                                                                   
tsign1                                                                                             
tempave_metab.sc                                                                                   
seas.sc                                                                                            
microclim.sc                                                                                       
mass.sc                                                                                            
speed.sc                                                                                           
consumerfrac.sc                                                                                    
nspp.sc                                                                                            
npp.sc                                                                                             
veg.sc                                                                                             
duration.sc                                                                                        
temptrend_abs.sc:REALMMarine                                                                       
temptrend_abs.sc:REALMTerrestrial                                                                  
temptrend_abs.sc:tsign1                                                                            
temptrend_abs.sc:tempave_metab.sc                 0.052                                            
temptrend_abs.sc:seas.sc                         -0.021  0.109                                     
temptrend_abs.sc:microclim.sc                     0.020 -0.040   0.113                             
temptrend_abs.sc:mass.sc                          0.001  0.168   0.052            -0.043           
temptrend_abs.sc:speed.sc                        -0.035 -0.331  -0.003             0.043           
temptrend_abs.sc:consumerfrac.sc                  0.032 -0.124  -0.063            -0.027           
temptrend_abs.sc:nspp.sc                          0.029 -0.138  -0.040            -0.043           
tsign-1:thermal_bias.sc                          -0.042 -0.114   0.159             0.007           
tsign1:thermal_bias.sc                            0.001 -0.216   0.205             0.042           
temptrend_abs.sc:npp.sc                           0.003  0.030  -0.182            -0.312           
temptrend_abs.sc:veg.sc                           0.052  0.004   0.149             0.028           
                                                 tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                     
REALMMarine                                                                                          
REALMTerrestrial                                                                                     
tsign1                                                                                               
tempave_metab.sc                                                                                     
seas.sc                                                                                              
microclim.sc                                                                                         
mass.sc                                                                                              
speed.sc                                                                                             
consumerfrac.sc                                                                                      
nspp.sc                                                                                              
npp.sc                                                                                               
veg.sc                                                                                               
duration.sc                                                                                          
temptrend_abs.sc:REALMMarine                                                                         
temptrend_abs.sc:REALMTerrestrial                                                                    
temptrend_abs.sc:tsign1                                                                              
temptrend_abs.sc:tempave_metab.sc                                                                    
temptrend_abs.sc:seas.sc                                                                             
temptrend_abs.sc:microclim.sc                                                                        
temptrend_abs.sc:mass.sc                                                                             
temptrend_abs.sc:speed.sc                        -0.475                                              
temptrend_abs.sc:consumerfrac.sc                 -0.043            -0.120                            
temptrend_abs.sc:nspp.sc                          0.003             0.183             0.085          
tsign-1:thermal_bias.sc                           0.021             0.018            -0.005          
tsign1:thermal_bias.sc                            0.007             0.030             0.020          
temptrend_abs.sc:npp.sc                           0.039             0.037            -0.017          
temptrend_abs.sc:veg.sc                           0.004             0.000            -0.011          
                                                 tmptrnd_bs.sc:ns. t-1:_. ts1:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                  
REALMMarine                                                                                       
REALMTerrestrial                                                                                  
tsign1                                                                                            
tempave_metab.sc                                                                                  
seas.sc                                                                                           
microclim.sc                                                                                      
mass.sc                                                                                           
speed.sc                                                                                          
consumerfrac.sc                                                                                   
nspp.sc                                                                                           
npp.sc                                                                                            
veg.sc                                                                                            
duration.sc                                                                                       
temptrend_abs.sc:REALMMarine                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                 
temptrend_abs.sc:tsign1                                                                           
temptrend_abs.sc:tempave_metab.sc                                                                 
temptrend_abs.sc:seas.sc                                                                          
temptrend_abs.sc:microclim.sc                                                                     
temptrend_abs.sc:mass.sc                                                                          
temptrend_abs.sc:speed.sc                                                                         
temptrend_abs.sc:consumerfrac.sc                                                                  
temptrend_abs.sc:nspp.sc                                                                          
tsign-1:thermal_bias.sc                           0.018                                           
tsign1:thermal_bias.sc                            0.032             0.357                         
temptrend_abs.sc:npp.sc                          -0.114            -0.002  0.055                  
temptrend_abs.sc:veg.sc                           0.017             0.020 -0.012 -0.250           
                                                 tmptrnd_bs.sc:v. tmptrnd_bs.sc:d. h_.:REALM2T h_.:REALM2M t_.:-1
temptrend_abs.sc                                                                                                 
REALMMarine                                                                                                      
REALMTerrestrial                                                                                                 
tsign1                                                                                                           
tempave_metab.sc                                                                                                 
seas.sc                                                                                                          
microclim.sc                                                                                                     
mass.sc                                                                                                          
speed.sc                                                                                                         
consumerfrac.sc                                                                                                  
nspp.sc                                                                                                          
npp.sc                                                                                                           
veg.sc                                                                                                           
duration.sc                                                                                                      
temptrend_abs.sc:REALMMarine                                                                                     
temptrend_abs.sc:REALMTerrestrial                                                                                
temptrend_abs.sc:tsign1                                                                                          
temptrend_abs.sc:tempave_metab.sc                                                                                
temptrend_abs.sc:seas.sc                                                                                         
temptrend_abs.sc:microclim.sc                                                                                    
temptrend_abs.sc:mass.sc                                                                                         
temptrend_abs.sc:speed.sc                                                                                        
temptrend_abs.sc:consumerfrac.sc                                                                                 
temptrend_abs.sc:nspp.sc                                                                                         
tsign-1:thermal_bias.sc                                                                                          
tsign1:thermal_bias.sc                                                                                           
temptrend_abs.sc:npp.sc                                                                                          
temptrend_abs.sc:veg.sc                                                                                          
                                                 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                      
REALMMarine                                                           
REALMTerrestrial                                                      
tsign1                                                                
tempave_metab.sc                                                      
seas.sc                                                               
microclim.sc                                                          
mass.sc                                                               
speed.sc                                                              
consumerfrac.sc                                                       
nspp.sc                                                               
npp.sc                                                                
veg.sc                                                                
duration.sc                                                           
temptrend_abs.sc:REALMMarine                                          
temptrend_abs.sc:REALMTerrestrial                                     
temptrend_abs.sc:tsign1                                               
temptrend_abs.sc:tempave_metab.sc                                     
temptrend_abs.sc:seas.sc                                              
temptrend_abs.sc:microclim.sc                                         
temptrend_abs.sc:mass.sc                                              
temptrend_abs.sc:speed.sc                                             
temptrend_abs.sc:consumerfrac.sc                                      
temptrend_abs.sc:nspp.sc                                              
tsign-1:thermal_bias.sc                                               
tsign1:thermal_bias.sc                                                
temptrend_abs.sc:npp.sc                                               
temptrend_abs.sc:veg.sc                                               
 [ reached getOption("max.print") -- omitted 7 rows ]

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-6.64180587 -0.23617979 -0.02235224  0.26661608  5.42260805 

Number of Observations: 36017
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   231                  36017 
summary(modTfullJbetarem0)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.00722145 (Intr)
temptrend_abs.sc 0.01729128 -0.058

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept)  Residual
StdDev: 0.003744118 0.9597427

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-1.892596 
Fixed effects: Jbetatrendrem0 ~ temptrend_abs.sc * REALM + temptrend_abs.sc *      tsign + temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      consumerfrac.sc + temptrend_abs.sc * nspp.sc + temptrend_abs.sc *      thermal_bias.sc:tsign + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      veg.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. REALMM REALMT tsign1 tmpv_. ses.sc mcrcl. mss.sc
temptrend_abs.sc                                 -0.573                                                        
REALMMarine                                      -0.947  0.551                                                 
REALMTerrestrial                                 -0.752  0.385  0.701                                          
tsign1                                           -0.084  0.047  0.004  0.001                                   
tempave_metab.sc                                  0.100 -0.026 -0.084 -0.244  0.098                            
seas.sc                                          -0.131  0.077  0.178 -0.069 -0.074  0.088                     
microclim.sc                                     -0.078  0.060  0.090  0.022 -0.001 -0.183  0.138              
mass.sc                                           0.095 -0.010 -0.071 -0.043  0.001  0.089  0.091  0.007       
speed.sc                                          0.081 -0.063 -0.041 -0.088 -0.086 -0.110 -0.014  0.039 -0.493
consumerfrac.sc                                  -0.012  0.017  0.010  0.096 -0.022 -0.105 -0.031  0.020  0.012
nspp.sc                                           0.007 -0.032 -0.062 -0.038  0.049 -0.200 -0.033 -0.135 -0.054
npp.sc                                            0.025 -0.013 -0.040  0.032  0.066  0.073 -0.077 -0.140 -0.028
veg.sc                                           -0.442  0.365  0.462  0.011 -0.014 -0.003  0.073 -0.003  0.018
duration.sc                                      -0.041  0.009  0.031 -0.003 -0.144  0.129 -0.003 -0.024 -0.042
temptrend_abs.sc:REALMMarine                      0.554 -0.951 -0.570 -0.361 -0.009  0.023 -0.099 -0.066  0.000
temptrend_abs.sc:REALMTerrestrial                 0.377 -0.740 -0.350 -0.552  0.001  0.148  0.116  0.024 -0.011
temptrend_abs.sc:tsign1                           0.055 -0.127 -0.022  0.002 -0.442 -0.055  0.003 -0.006 -0.004
temptrend_abs.sc:tempave_metab.sc                -0.001  0.056 -0.009  0.132 -0.104 -0.539 -0.130  0.018 -0.066
temptrend_abs.sc:seas.sc                          0.079 -0.108 -0.106  0.104  0.050 -0.090 -0.726 -0.122 -0.063
temptrend_abs.sc:microclim.sc                     0.053 -0.078 -0.061  0.002 -0.009  0.112 -0.091 -0.780  0.012
temptrend_abs.sc:mass.sc                         -0.018  0.040  0.012 -0.009 -0.004 -0.077 -0.056  0.024 -0.577
temptrend_abs.sc:speed.sc                        -0.070  0.093  0.057  0.080  0.074  0.129  0.055 -0.019  0.240
temptrend_abs.sc:consumerfrac.sc                  0.010 -0.032 -0.009 -0.076  0.016  0.077  0.031  0.012  0.003
temptrend_abs.sc:nspp.sc                         -0.023  0.016  0.048  0.045 -0.026  0.119  0.035  0.070  0.011
tsign-1:thermal_bias.sc                           0.066 -0.022 -0.062 -0.049 -0.068  0.135 -0.240 -0.022 -0.040
tsign1:thermal_bias.sc                            0.122 -0.044 -0.126 -0.104  0.066  0.252 -0.437 -0.133 -0.017
temptrend_abs.sc:npp.sc                          -0.002  0.057  0.015 -0.054 -0.040 -0.016  0.065  0.155  0.001
temptrend_abs.sc:veg.sc                           0.351 -0.443 -0.367  0.020 -0.001 -0.016 -0.088 -0.009 -0.010
                                                 spd.sc cnsmr. nspp.s npp.sc veg.sc drtn.s t_.:REALMM t_.:REALMT
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tsign1                                                                                                          
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
consumerfrac.sc                                  -0.089                                                         
nspp.sc                                           0.212  0.100                                                  
npp.sc                                            0.163 -0.052 -0.198                                           
veg.sc                                           -0.024 -0.018  0.023 -0.204                                    
duration.sc                                      -0.033  0.012 -0.240  0.077 -0.012                             
temptrend_abs.sc:REALMMarine                      0.039 -0.010  0.063  0.038 -0.386 -0.008                      
temptrend_abs.sc:REALMTerrestrial                 0.076 -0.073  0.049 -0.055  0.021  0.007  0.690               
temptrend_abs.sc:tsign1                           0.033  0.004 -0.025 -0.056 -0.025  0.020  0.040      0.006    
temptrend_abs.sc:tempave_metab.sc                 0.142  0.085  0.123 -0.020 -0.009 -0.054 -0.041     -0.239    
temptrend_abs.sc:seas.sc                          0.014  0.028  0.045  0.090 -0.086 -0.036  0.149     -0.173    
temptrend_abs.sc:microclim.sc                    -0.029 -0.008  0.083  0.167 -0.009  0.011  0.090     -0.058    
temptrend_abs.sc:mass.sc                          0.282  0.015  0.014 -0.015 -0.010  0.055 -0.003      0.016    
temptrend_abs.sc:speed.sc                        -0.601  0.071 -0.148 -0.068  0.004  0.014 -0.042     -0.098    
temptrend_abs.sc:consumerfrac.sc                  0.080 -0.717 -0.065  0.026  0.009 -0.023  0.019      0.109    
temptrend_abs.sc:nspp.sc                         -0.153 -0.045 -0.640  0.108 -0.028  0.167 -0.078     -0.068    
tsign-1:thermal_bias.sc                           0.027  0.006 -0.048  0.004 -0.012  0.085  0.029      0.020    
tsign1:thermal_bias.sc                            0.026 -0.030 -0.081 -0.042  0.000  0.105  0.035      0.057    
temptrend_abs.sc:npp.sc                          -0.085  0.016  0.109 -0.733  0.163 -0.056 -0.093      0.085    
temptrend_abs.sc:veg.sc                           0.006  0.013 -0.026  0.181 -0.813  0.012  0.474     -0.031    
                                                 tm_.:1 tm_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                   
REALMMarine                                                                                        
REALMTerrestrial                                                                                   
tsign1                                                                                             
tempave_metab.sc                                                                                   
seas.sc                                                                                            
microclim.sc                                                                                       
mass.sc                                                                                            
speed.sc                                                                                           
consumerfrac.sc                                                                                    
nspp.sc                                                                                            
npp.sc                                                                                             
veg.sc                                                                                             
duration.sc                                                                                        
temptrend_abs.sc:REALMMarine                                                                       
temptrend_abs.sc:REALMTerrestrial                                                                  
temptrend_abs.sc:tsign1                                                                            
temptrend_abs.sc:tempave_metab.sc                 0.047                                            
temptrend_abs.sc:seas.sc                         -0.018  0.080                                     
temptrend_abs.sc:microclim.sc                     0.009  0.029   0.157                             
temptrend_abs.sc:mass.sc                          0.009  0.140   0.042            -0.046           
temptrend_abs.sc:speed.sc                        -0.031 -0.308   0.027             0.032           
temptrend_abs.sc:consumerfrac.sc                  0.018 -0.106  -0.070            -0.031           
temptrend_abs.sc:nspp.sc                          0.024 -0.134  -0.035            -0.050           
tsign-1:thermal_bias.sc                          -0.046 -0.045   0.153             0.009           
tsign1:thermal_bias.sc                            0.016 -0.124   0.210             0.051           
temptrend_abs.sc:npp.sc                           0.025  0.053  -0.193            -0.305           
temptrend_abs.sc:veg.sc                           0.047 -0.014   0.141             0.056           
                                                 tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                     
REALMMarine                                                                                          
REALMTerrestrial                                                                                     
tsign1                                                                                               
tempave_metab.sc                                                                                     
seas.sc                                                                                              
microclim.sc                                                                                         
mass.sc                                                                                              
speed.sc                                                                                             
consumerfrac.sc                                                                                      
nspp.sc                                                                                              
npp.sc                                                                                               
veg.sc                                                                                               
duration.sc                                                                                          
temptrend_abs.sc:REALMMarine                                                                         
temptrend_abs.sc:REALMTerrestrial                                                                    
temptrend_abs.sc:tsign1                                                                              
temptrend_abs.sc:tempave_metab.sc                                                                    
temptrend_abs.sc:seas.sc                                                                             
temptrend_abs.sc:microclim.sc                                                                        
temptrend_abs.sc:mass.sc                                                                             
temptrend_abs.sc:speed.sc                        -0.446                                              
temptrend_abs.sc:consumerfrac.sc                 -0.050            -0.119                            
temptrend_abs.sc:nspp.sc                         -0.002             0.166             0.084          
tsign-1:thermal_bias.sc                           0.019            -0.008            -0.009          
tsign1:thermal_bias.sc                            0.013            -0.009             0.019          
temptrend_abs.sc:npp.sc                           0.047             0.029            -0.021          
temptrend_abs.sc:veg.sc                           0.005             0.012            -0.016          
                                                 tmptrnd_bs.sc:ns. t-1:_. ts1:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                  
REALMMarine                                                                                       
REALMTerrestrial                                                                                  
tsign1                                                                                            
tempave_metab.sc                                                                                  
seas.sc                                                                                           
microclim.sc                                                                                      
mass.sc                                                                                           
speed.sc                                                                                          
consumerfrac.sc                                                                                   
nspp.sc                                                                                           
npp.sc                                                                                            
veg.sc                                                                                            
duration.sc                                                                                       
temptrend_abs.sc:REALMMarine                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                 
temptrend_abs.sc:tsign1                                                                           
temptrend_abs.sc:tempave_metab.sc                                                                 
temptrend_abs.sc:seas.sc                                                                          
temptrend_abs.sc:microclim.sc                                                                     
temptrend_abs.sc:mass.sc                                                                          
temptrend_abs.sc:speed.sc                                                                         
temptrend_abs.sc:consumerfrac.sc                                                                  
temptrend_abs.sc:nspp.sc                                                                          
tsign-1:thermal_bias.sc                           0.017                                           
tsign1:thermal_bias.sc                            0.025             0.340                         
temptrend_abs.sc:npp.sc                          -0.114             0.006  0.081                  
temptrend_abs.sc:veg.sc                           0.013             0.012 -0.026 -0.281           
                                                 tmptrnd_bs.sc:v. tmptrnd_bs.sc:d. h_.:REALM2T h_.:REALM2M t_.:-1
temptrend_abs.sc                                                                                                 
REALMMarine                                                                                                      
REALMTerrestrial                                                                                                 
tsign1                                                                                                           
tempave_metab.sc                                                                                                 
seas.sc                                                                                                          
microclim.sc                                                                                                     
mass.sc                                                                                                          
speed.sc                                                                                                         
consumerfrac.sc                                                                                                  
nspp.sc                                                                                                          
npp.sc                                                                                                           
veg.sc                                                                                                           
duration.sc                                                                                                      
temptrend_abs.sc:REALMMarine                                                                                     
temptrend_abs.sc:REALMTerrestrial                                                                                
temptrend_abs.sc:tsign1                                                                                          
temptrend_abs.sc:tempave_metab.sc                                                                                
temptrend_abs.sc:seas.sc                                                                                         
temptrend_abs.sc:microclim.sc                                                                                    
temptrend_abs.sc:mass.sc                                                                                         
temptrend_abs.sc:speed.sc                                                                                        
temptrend_abs.sc:consumerfrac.sc                                                                                 
temptrend_abs.sc:nspp.sc                                                                                         
tsign-1:thermal_bias.sc                                                                                          
tsign1:thermal_bias.sc                                                                                           
temptrend_abs.sc:npp.sc                                                                                          
temptrend_abs.sc:veg.sc                                                                                          
                                                 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                      
REALMMarine                                                           
REALMTerrestrial                                                      
tsign1                                                                
tempave_metab.sc                                                      
seas.sc                                                               
microclim.sc                                                          
mass.sc                                                               
speed.sc                                                              
consumerfrac.sc                                                       
nspp.sc                                                               
npp.sc                                                                
veg.sc                                                                
duration.sc                                                           
temptrend_abs.sc:REALMMarine                                          
temptrend_abs.sc:REALMTerrestrial                                     
temptrend_abs.sc:tsign1                                               
temptrend_abs.sc:tempave_metab.sc                                     
temptrend_abs.sc:seas.sc                                              
temptrend_abs.sc:microclim.sc                                         
temptrend_abs.sc:mass.sc                                              
temptrend_abs.sc:speed.sc                                             
temptrend_abs.sc:consumerfrac.sc                                      
temptrend_abs.sc:nspp.sc                                              
tsign-1:thermal_bias.sc                                               
tsign1:thermal_bias.sc                                                
temptrend_abs.sc:npp.sc                                               
temptrend_abs.sc:veg.sc                                               
 [ reached getOption("max.print") -- omitted 7 rows ]

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-8.38434700 -0.32179127 -0.03059932  0.31554016  8.33570233 

Number of Observations: 36017
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   231                  36017 
summary(modTfullHornrem0)
Linear mixed-effects model fit by REML
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.01556817 (Intr)
temptrend_abs.sc 0.02706589 -0.065

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.01880474 2.445174

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.327824 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc * REALM + temptrend_abs.sc *      tsign + temptrend_abs.sc * tempave_metab.sc + temptrend_abs.sc *      seas.sc + temptrend_abs.sc * microclim.sc + temptrend_abs.sc *      mass.sc + temptrend_abs.sc * speed.sc + temptrend_abs.sc *      consumerfrac.sc + temptrend_abs.sc * nspp.sc + temptrend_abs.sc *      thermal_bias.sc:tsign + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      veg.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc:REALM2 
 Correlation: 
                                                 (Intr) tmpt_. REALMM REALMT tsign1 tmpv_. ses.sc mcrcl. mss.sc
temptrend_abs.sc                                 -0.501                                                        
REALMMarine                                      -0.954  0.479                                                 
REALMTerrestrial                                 -0.737  0.361  0.685                                          
tsign1                                           -0.065  0.046 -0.001  0.011                                   
tempave_metab.sc                                  0.101 -0.030 -0.080 -0.245  0.030                            
seas.sc                                          -0.109  0.050  0.157 -0.095 -0.088  0.103                     
microclim.sc                                     -0.067  0.042  0.076  0.017  0.014 -0.185  0.101              
mass.sc                                           0.067 -0.007 -0.044 -0.030 -0.007  0.089  0.096  0.007       
speed.sc                                          0.085 -0.062 -0.039 -0.090 -0.069 -0.078 -0.011  0.059 -0.421
consumerfrac.sc                                  -0.017  0.024  0.010  0.088  0.033 -0.120 -0.052  0.016 -0.014
nspp.sc                                           0.008 -0.037 -0.051 -0.053  0.052 -0.146  0.006 -0.090 -0.060
npp.sc                                            0.026  0.001 -0.038  0.058  0.012  0.024 -0.189 -0.215 -0.036
veg.sc                                           -0.518  0.276  0.536  0.028 -0.012  0.007  0.086  0.005  0.013
duration.sc                                      -0.021  0.012  0.029  0.021 -0.149  0.077 -0.030 -0.022 -0.027
temptrend_abs.sc:REALMMarine                      0.485 -0.949 -0.497 -0.337 -0.014  0.029 -0.069 -0.049 -0.004
temptrend_abs.sc:REALMTerrestrial                 0.322 -0.727 -0.296 -0.510 -0.003  0.161  0.123  0.019 -0.017
temptrend_abs.sc:tsign1                           0.041 -0.112 -0.010  0.003 -0.490 -0.038  0.007 -0.009  0.005
temptrend_abs.sc:tempave_metab.sc                -0.008  0.041 -0.001  0.142 -0.063 -0.500 -0.094  0.047 -0.052
temptrend_abs.sc:seas.sc                          0.059 -0.087 -0.081  0.111  0.052 -0.064 -0.641 -0.093 -0.060
temptrend_abs.sc:microclim.sc                     0.029 -0.045 -0.034  0.002 -0.024  0.103 -0.051 -0.705  0.016
temptrend_abs.sc:mass.sc                         -0.010  0.023  0.005 -0.014  0.012 -0.062 -0.054  0.020 -0.580
temptrend_abs.sc:speed.sc                        -0.047  0.100  0.033  0.075  0.048  0.099  0.041 -0.036  0.222
temptrend_abs.sc:consumerfrac.sc                  0.013 -0.035 -0.012 -0.064 -0.016  0.087  0.031  0.014  0.019
temptrend_abs.sc:nspp.sc                         -0.025  0.029  0.040  0.054 -0.019  0.077  0.011  0.047  0.009
tsign-1:thermal_bias.sc                           0.060 -0.021 -0.056 -0.059 -0.088  0.204 -0.213 -0.040 -0.045
tsign1:thermal_bias.sc                            0.103 -0.035 -0.105 -0.109  0.070  0.342 -0.321 -0.140 -0.016
temptrend_abs.sc:npp.sc                           0.010  0.023 -0.006 -0.055 -0.005 -0.012  0.086  0.158 -0.004
temptrend_abs.sc:veg.sc                           0.306 -0.426 -0.317  0.025 -0.011 -0.024 -0.102  0.009 -0.013
                                                 spd.sc cnsmr. nspp.s npp.sc veg.sc drtn.s t_.:REALMM t_.:REALMT
temptrend_abs.sc                                                                                                
REALMMarine                                                                                                     
REALMTerrestrial                                                                                                
tsign1                                                                                                          
tempave_metab.sc                                                                                                
seas.sc                                                                                                         
microclim.sc                                                                                                    
mass.sc                                                                                                         
speed.sc                                                                                                        
consumerfrac.sc                                  -0.086                                                         
nspp.sc                                           0.179  0.094                                                  
npp.sc                                            0.120 -0.037 -0.198                                           
veg.sc                                           -0.005 -0.003  0.021 -0.163                                    
duration.sc                                       0.011  0.008 -0.241  0.053 -0.006                             
temptrend_abs.sc:REALMMarine                      0.035 -0.018  0.063  0.018 -0.292 -0.016                      
temptrend_abs.sc:REALMTerrestrial                 0.082 -0.062  0.062 -0.057  0.030 -0.014  0.674               
temptrend_abs.sc:tsign1                           0.031 -0.012 -0.021 -0.035 -0.008  0.033  0.035      0.006    
temptrend_abs.sc:tempave_metab.sc                 0.118  0.079  0.088 -0.044 -0.013 -0.016 -0.027     -0.273    
temptrend_abs.sc:seas.sc                          0.013  0.019  0.025  0.125 -0.089 -0.016  0.123     -0.209    
temptrend_abs.sc:microclim.sc                    -0.040 -0.007  0.051  0.172  0.014  0.011  0.057     -0.060    
temptrend_abs.sc:mass.sc                          0.245  0.026  0.011 -0.011 -0.009  0.047  0.012      0.032    
temptrend_abs.sc:speed.sc                        -0.581  0.071 -0.127 -0.042 -0.015 -0.008 -0.043     -0.109    
temptrend_abs.sc:consumerfrac.sc                  0.074 -0.719 -0.063  0.013 -0.001 -0.021  0.023      0.094    
temptrend_abs.sc:nspp.sc                         -0.134 -0.044 -0.615  0.100 -0.021  0.150 -0.081     -0.080    
tsign-1:thermal_bias.sc                           0.004 -0.007 -0.044  0.008 -0.005  0.073  0.027      0.027    
tsign1:thermal_bias.sc                           -0.022 -0.017 -0.065 -0.057 -0.007  0.085  0.028      0.053    
temptrend_abs.sc:npp.sc                          -0.058  0.005  0.098 -0.652  0.098 -0.036 -0.052      0.088    
temptrend_abs.sc:veg.sc                           0.000  0.003 -0.021  0.158 -0.620  0.002  0.456     -0.060    
                                                 tm_.:1 tm_.:_. tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc.
temptrend_abs.sc                                                                                   
REALMMarine                                                                                        
REALMTerrestrial                                                                                   
tsign1                                                                                             
tempave_metab.sc                                                                                   
seas.sc                                                                                            
microclim.sc                                                                                       
mass.sc                                                                                            
speed.sc                                                                                           
consumerfrac.sc                                                                                    
nspp.sc                                                                                            
npp.sc                                                                                             
veg.sc                                                                                             
duration.sc                                                                                        
temptrend_abs.sc:REALMMarine                                                                       
temptrend_abs.sc:REALMTerrestrial                                                                  
temptrend_abs.sc:tsign1                                                                            
temptrend_abs.sc:tempave_metab.sc                 0.036                                            
temptrend_abs.sc:seas.sc                         -0.027  0.073                                     
temptrend_abs.sc:microclim.sc                     0.005  0.021   0.115                             
temptrend_abs.sc:mass.sc                         -0.003  0.103   0.050            -0.051           
temptrend_abs.sc:speed.sc                        -0.022 -0.285   0.012             0.040           
temptrend_abs.sc:consumerfrac.sc                  0.032 -0.099  -0.060            -0.037           
temptrend_abs.sc:nspp.sc                          0.012 -0.121  -0.028            -0.020           
tsign-1:thermal_bias.sc                          -0.029 -0.061   0.132             0.022           
tsign1:thermal_bias.sc                            0.009 -0.115   0.148             0.048           
temptrend_abs.sc:npp.sc                           0.004  0.077  -0.208            -0.321           
temptrend_abs.sc:veg.sc                           0.054  0.006   0.173             0.006           
                                                 tmptrnd_bs.sc:ms. tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c.
temptrend_abs.sc                                                                                     
REALMMarine                                                                                          
REALMTerrestrial                                                                                     
tsign1                                                                                               
tempave_metab.sc                                                                                     
seas.sc                                                                                              
microclim.sc                                                                                         
mass.sc                                                                                              
speed.sc                                                                                             
consumerfrac.sc                                                                                      
nspp.sc                                                                                              
npp.sc                                                                                               
veg.sc                                                                                               
duration.sc                                                                                          
temptrend_abs.sc:REALMMarine                                                                         
temptrend_abs.sc:REALMTerrestrial                                                                    
temptrend_abs.sc:tsign1                                                                              
temptrend_abs.sc:tempave_metab.sc                                                                    
temptrend_abs.sc:seas.sc                                                                             
temptrend_abs.sc:microclim.sc                                                                        
temptrend_abs.sc:mass.sc                                                                             
temptrend_abs.sc:speed.sc                        -0.394                                              
temptrend_abs.sc:consumerfrac.sc                 -0.060            -0.116                            
temptrend_abs.sc:nspp.sc                          0.007             0.159             0.088          
tsign-1:thermal_bias.sc                           0.020             0.003             0.002          
tsign1:thermal_bias.sc                            0.019             0.011             0.014          
temptrend_abs.sc:npp.sc                           0.052             0.013             0.000          
temptrend_abs.sc:veg.sc                           0.007             0.023            -0.006          
                                                 tmptrnd_bs.sc:ns. t-1:_. ts1:_. tmptrnd_bs.sc:np.
temptrend_abs.sc                                                                                  
REALMMarine                                                                                       
REALMTerrestrial                                                                                  
tsign1                                                                                            
tempave_metab.sc                                                                                  
seas.sc                                                                                           
microclim.sc                                                                                      
mass.sc                                                                                           
speed.sc                                                                                          
consumerfrac.sc                                                                                   
nspp.sc                                                                                           
npp.sc                                                                                            
veg.sc                                                                                            
duration.sc                                                                                       
temptrend_abs.sc:REALMMarine                                                                      
temptrend_abs.sc:REALMTerrestrial                                                                 
temptrend_abs.sc:tsign1                                                                           
temptrend_abs.sc:tempave_metab.sc                                                                 
temptrend_abs.sc:seas.sc                                                                          
temptrend_abs.sc:microclim.sc                                                                     
temptrend_abs.sc:mass.sc                                                                          
temptrend_abs.sc:speed.sc                                                                         
temptrend_abs.sc:consumerfrac.sc                                                                  
temptrend_abs.sc:nspp.sc                                                                          
tsign-1:thermal_bias.sc                           0.014                                           
tsign1:thermal_bias.sc                            0.022             0.393                         
temptrend_abs.sc:npp.sc                          -0.100            -0.016  0.045                  
temptrend_abs.sc:veg.sc                           0.012             0.015 -0.016 -0.242           
                                                 tmptrnd_bs.sc:v. tmptrnd_bs.sc:d. h_.:REALM2T h_.:REALM2M t_.:-1
temptrend_abs.sc                                                                                                 
REALMMarine                                                                                                      
REALMTerrestrial                                                                                                 
tsign1                                                                                                           
tempave_metab.sc                                                                                                 
seas.sc                                                                                                          
microclim.sc                                                                                                     
mass.sc                                                                                                          
speed.sc                                                                                                         
consumerfrac.sc                                                                                                  
nspp.sc                                                                                                          
npp.sc                                                                                                           
veg.sc                                                                                                           
duration.sc                                                                                                      
temptrend_abs.sc:REALMMarine                                                                                     
temptrend_abs.sc:REALMTerrestrial                                                                                
temptrend_abs.sc:tsign1                                                                                          
temptrend_abs.sc:tempave_metab.sc                                                                                
temptrend_abs.sc:seas.sc                                                                                         
temptrend_abs.sc:microclim.sc                                                                                    
temptrend_abs.sc:mass.sc                                                                                         
temptrend_abs.sc:speed.sc                                                                                        
temptrend_abs.sc:consumerfrac.sc                                                                                 
temptrend_abs.sc:nspp.sc                                                                                         
tsign-1:thermal_bias.sc                                                                                          
tsign1:thermal_bias.sc                                                                                           
temptrend_abs.sc:npp.sc                                                                                          
temptrend_abs.sc:veg.sc                                                                                          
                                                 t_.:1: t_.:_.:REALM2T
temptrend_abs.sc                                                      
REALMMarine                                                           
REALMTerrestrial                                                      
tsign1                                                                
tempave_metab.sc                                                      
seas.sc                                                               
microclim.sc                                                          
mass.sc                                                               
speed.sc                                                              
consumerfrac.sc                                                       
nspp.sc                                                               
npp.sc                                                                
veg.sc                                                                
duration.sc                                                           
temptrend_abs.sc:REALMMarine                                          
temptrend_abs.sc:REALMTerrestrial                                     
temptrend_abs.sc:tsign1                                               
temptrend_abs.sc:tempave_metab.sc                                     
temptrend_abs.sc:seas.sc                                              
temptrend_abs.sc:microclim.sc                                         
temptrend_abs.sc:mass.sc                                              
temptrend_abs.sc:speed.sc                                             
temptrend_abs.sc:consumerfrac.sc                                      
temptrend_abs.sc:nspp.sc                                              
tsign-1:thermal_bias.sc                                               
tsign1:thermal_bias.sc                                                
temptrend_abs.sc:npp.sc                                               
temptrend_abs.sc:veg.sc                                               
 [ reached getOption("max.print") -- omitted 7 rows ]

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.67542034 -0.23386259 -0.02454167  0.23164547  5.75602618 

Number of Observations: 35327
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                   200                  35327 

Plots from the full models

Plot the coefficients


coefs1 <- summary(modTfullJturem0)$tTable
coefs2 <- summary(modTfullJbetarem0)$tTable
coefs3 <- summary(modTfullHornrem0)$tTable

varstoplot <- unique(c(rownames(coefs1), rownames(coefs2), rownames(coefs3)))
varstoplot <- varstoplot[which(!grepl('Intercept', varstoplot) | grepl(':', varstoplot))] # vars to plot

rows1_1 <- which(rownames(coefs1) %in% varstoplot) # rows in coefs
rows1_2 <- which(rownames(coefs2) %in% varstoplot)
rows1_3 <- which(rownames(coefs3) %in% varstoplot)
xlims <- range(c(coefs1[rows1_1,1] - coefs1[rows1_1,2], coefs1[rows1_1,1] + coefs1[rows1_1,2], 
                  coefs2[rows1_2,1] - coefs2[rows1_2,2], coefs2[rows1_2,1] + coefs2[rows1_2,2], 
                  coefs3[rows1_3,1] - coefs3[rows1_3,2], coefs3[rows1_3,1] + coefs3[rows1_3,2]))


cols <- brewer.pal(3, 'Dark2') # for Jtu, Jbeta and Horn models
pchs <- c(16, 16, 16)
offs <- c(0.1, 0, -0.1) # offset vertically for each model


par(las = 1, mai = c(0.5, 4, 0.1, 0.1))

plot(0,0, col = 'white', xlim = xlims, ylim = c(1,length(varstoplot)), yaxt='n', xlab = '', ylab ='')
axis(2, at = length(varstoplot):1, labels = varstoplot, cex.axis = 0.7)
abline(v = 0, col = 'grey', lty = 2)
abline(h = 1:length(varstoplot), col = 'grey', lty = 3)
for(i in 1:length(varstoplot)){
  if(varstoplot[i] %in% rownames(coefs1)){
    x = coefs1[rownames(coefs1) == varstoplot[i], 1]
    se = coefs1[rownames(coefs1) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[1], pch = pchs[1], col = cols[1])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[1], length(varstoplot) + 1 - i + offs[1]), col = cols[1])
  }
  if(varstoplot[i] %in% rownames(coefs2)){
    x = coefs2[rownames(coefs2) == varstoplot[i], 1]
    se = coefs2[rownames(coefs2) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[2], pch = pchs[2], col = cols[2])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[2], length(varstoplot) + 1 - i + offs[2]), col = cols[2])
  }
  if(varstoplot[i] %in% rownames(coefs3)){
    x = coefs3[rownames(coefs3) == varstoplot[i], 1]
    se = coefs3[rownames(coefs3) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[3], pch = pchs[3], col = cols[3])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[3], length(varstoplot) + 1 - i + offs[3]), col = cols[3])
  }
}
legend('topleft', col = cols, pch = 16, lwd = 1, legend = c('Jtu', 'Jbeta', 'Horn'), cex = 0.5)

Plot interactions (Jaccard turnover) without year 1

## NEED TO ALIGN THE INTS DF AGAIN

# set up the interactions to plot
ints <- data.frame(vars = c('tsign', 'tempave_metab', 'seas', 'microclim', 'mass', 'speed', 
                            'consumerfrac', 'nspp', 'thermal_bias', 'npp', 'veg', 'duration', 
                            'human_bowler', 'human_bowler'),
           min =      c(1, -10, 0.1, 0,   0,   0,   0,   0.3, -10, 1.9, 0,   0.5, 0,   0), 
           max =      c(2, 30,  16,  6,   8,   2,   1,   2.6, 10,  3.7, 1,   2,   9,   9),
           log =      c(F, F,   F,   F,   T,   T,   F,   T,   F,   T,   F,   T,   F,   F),
           len =      c(2, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, 100),
           discrete = c(T, F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F,   F),
           REALM = c(rep('Freshwater', 13), 'Marine'),
           REALM2 = c(rep('TerrFresh', 13), 'Marine'),
           stringsAsFactors = FALSE)
basetab <- data.frame(tempave.sc = 0, tempave_metab.sc = 0, 
                      seas.sc = 0, microclim.sc = 0, mass.sc = 0, 
                      speed.sc = 0, lifespan.sc = 0, endothermfrac.sc = 0, 
                      nspp.sc = 0, thermal_bias.sc = 0, npp.sc = 0, human_bowler.sc = 0, veg.sc = 0,
                      consumerfrac.sc = 0, duration.sc = 0,
                      nyrBT = 20, STUDY_ID = 127L, rarefyID = '127_514668')

# make the data frames for each interaction to plot                
for(j in 1:nrow(ints)){
  # set up a grid of temperature trends and the interacting variable
  if(ints$log[j]) intvars <- list(temptrend = seq(-1.5, 1.5, length.out = 100), 
                                  new = 10^seq(ints$min[j], ints$max[j], length.out = ints$len[j]),
                                   var = ints$vars[j])
  if(!ints$log[j]) intvars <- list(temptrend = seq(-1.5, 1.5, length.out = 100), 
                                   new = seq(ints$min[j], ints$max[j], length.out = ints$len[j]),
                                   var = ints$vars[j])
  names(intvars) <- c('temptrend', ints$vars[j], 'var')
  thisdat <- expand.grid(intvars)
  
  # scale the interacting variable
  cent <- attr(trends[[paste0(ints$var[j], '.sc')]], 'scaled:center')
  scl <- attr(trends[[paste0(ints$var[j], '.sc')]], 'scaled:scale')
  if(!is.null(cent) & !is.null(scl)){
    if(ints$log[j]) thisdat[[paste0(ints$var[j], '.sc')]] <- (log(thisdat[[ints$var[j]]]) - cent)/scl
    if(!ints$log[j]) thisdat[[paste0(ints$var[j], '.sc')]] <- (thisdat[[ints$var[j]]] - cent)/scl
  }

  # merge with the rest of the columns
  if(ints$var[j] != 'tsign') colnamestouse <- setdiff(colnames(basetab), paste0(ints$var[j], '.sc'))
  if(ints$var[j] == 'tsign') colnamestouse <- setdiff(colnames(basetab), ints$var[j])
  thisdat <- cbind(thisdat, basetab[, colnamestouse])

  # add realm
  thisdat$REALM <- ints$REALM[j]
  thisdat$REALM2 <- ints$REALM2[j]
  
  # merge with the previous iterations
  if(j == 1) newdat <- thisdat
  if(j > 1){
    colstoadd <- setdiff(colnames(thisdat), colnames(newdat))
    for(toadd in colstoadd){
      newdat[[toadd]] <- NA
    }
    
    colstoadd2 <- setdiff(colnames(newdat), colnames(thisdat))
    for(toadd in colstoadd2){
      thisdat[[toadd]] <- NA
    }
    
    newdat <- rbind(newdat, thisdat)
  } 
}

# character so that new levels can be added
newdat$REALM <- as.character(newdat$REALM)
newdat$REALM2 <- as.character(newdat$REALM2)

# add extra rows so that all factor levels are represented (for predict.lme to work)
newdat <- rbind(newdat[1:4, ], newdat)
newdat$REALM[1:4] <- c('Marine', 'Marine', 'Terrestrial', 'Terrestrial')
newdat$REALM2[1:4] <- c('Marine', 'Marine', 'TerrFresh', 'TerrFresh')
newdat$temptrend[1:4] <- c(-1, 1, -1, 1)

# trim to at least some temperature change (so that tsign is -1 or 1)
newdat <- newdat[newdat$temptrend != 0,]

# scale the temperature vars
newdat$temptrend.sc <- newdat$temptrend/attr(trends$temptrend.sc, 'scaled:scale') 
newdat$temptrend_abs <- abs(newdat$temptrend)
newdat$temptrend_abs.sc <- (newdat$temptrend_abs)/attr(trends$temptrend_abs.sc, 'scaled:scale')
newdat$tsign <- factor(sign(newdat$temptrend))

# make predictions
newdat$preds <- predict(object = modTfullrem0, newdata = newdat, level = 0)

#remove the extra rows
newdat <- newdat[5:nrow(newdat), ]

# prep the plots
intplots <- vector('list', nrow(ints))
for(j in 1:length(intplots)){
  subs <- newdat$var == ints$vars[j] & newdat$temptrend > 0 # select warming side
  xvar <- 'temptrend_abs'
  title <- ints$vars[j]
  if(ints$vars[j] %in% c('tsign')){
    subs <- newdat$var == ints$vars[j]
  } 
  if(ints$vars[j] %in% c('thermal_bias')){
    subs <- newdat$var == ints$vars[j]
    xvar <- 'temptrend'
  } 
  if(ints$vars[j] %in% c('human_bowler')){
    subs <- newdat$var == ints$vars[j] & newdat$temptrend > 0 & newdat$REALM2 == ints$REALM2[j]
    title <- paste0('human:', ints$REALM2[j])
  } 

  thisplot <- ggplot(newdat[subs, ], 
                     aes_string(x = xvar, y = 'preds', 
                                group = ints$vars[j], 
                                color = ints$vars[j])) +
    geom_line() +
    coord_cartesian(ylim = c(-0.6, 0.6)) +
    theme(plot.margin = unit(c(0.5,0,0.5,0), 'cm')) +
    labs(title = title)
  if(ints$log[j] & !ints$discrete[j]){
    intplots[[j]] <- thisplot + scale_color_distiller(palette = "YlGnBu", trans = 'log')
  }
  if(!ints$log[j] & !ints$discrete[j]){
    intplots[[j]] <- thisplot + scale_color_distiller(palette = "YlGnBu", trans = 'identity')
  }
  if(ints$discrete[j]){
    intplots[[j]] <- thisplot + scale_color_brewer(palette = "Dark2")
  }
}

#grid.arrange(grobs = intplots, '+', theme(plot.margin = unit(c(0,0,0,0), 'cm'))), ncol=2)
#do.call('grid.arrange', c(intplots, ncol = 2))
grid.arrange(grobs = intplots, ncol = 3)


# write out the interactions
write.csv(newdat, file = 'temp/interactions.csv')

Plot residuals against each predictor (Jaccard turnover)

resids <- resid(modTfull1)
preds <- getData(modTfull1)
col = '#00000033'
cex = 0.5
par(mfrow = c(5,4))
boxplot(resids ~ preds$REALM, cex = cex, col = col)
plot(preds$temptrend_abs.sc, resids, cex = cex, col = col)
plot(preds$tsign, resids, cex = cex, col = col)
plot(preds$tempave.sc, resids, cex = cex, col = col)
plot(preds$tempave_metab.sc, resids, cex = cex, col = col)
plot(preds$seas.sc, resids, cex = cex, col = col)
plot(preds$microclim.sc, resids, cex = cex, col = col)
plot(preds$mass.sc, resids, cex = cex, col = col)
plot(preds$speed.sc, resids, cex = cex, col = col)
plot(preds$lifespan.sc, resids, cex = cex, col = col)
plot(preds$consumerfrac.sc, resids, cex = cex, col = col)
plot(preds$endothermfrac.sc, resids, cex = cex, col = col)
plot(preds$nspp.sc, resids, cex = cex, col = col)
plot(preds$thermal_bias.sc, resids, cex = cex, col = col)
plot(preds$npp.sc, resids, cex = cex, col = col)
plot(preds$veg.sc, resids, cex = cex, col = col)
plot(preds$human_bowler.sc, resids, cex = cex, col = col)

Remove each term from the full model

    tryCatch({
      modTdrops[[j+2]] <- lme(formula(paste0('Jtutrendrem0 ~ ', paste(terms[-j], collapse = ' + '))),
                              random = randef, weights = varef, data = trends[i,], method = 'ML')
      
    }, error = function(e){
      print('going to optim (Jtu)')
      tryCatch({
        modTdrops[[j+2]] <- lme(formula(paste0('Jtutrendrem0 ~ ', paste(terms[-j], collapse = ' + '))),
                                random = randef, weights = varef, data = trends[i,], method = 'ML',
                                control = lmeControl(opt = 'optim'))
        
      }, error = function(e){
        print('going to more iters (Jtu)') 
        tryCatch({
          modTdrops[[j+2]] <- lme(formula(paste0('Jtutrendrem0 ~ ', paste(terms[-j], collapse = ' + '))),
                                  random = randef, weights = varef, data = trends[i,], method = 'ML',
                                  control = lmeControl(maxIter = 100, msMaxIter = 100, niterEM = 50, msMaxEval = 500))
          
        }, error= function(e){
          print('giving up on this one')
          modTdrops[[j+2]] <- NA
        })
      })
    })
[1] "going to optim (Jtu)"
[1] "going to more iters (Jtu)"

Plot deltaAICs for all 3 models

# transform for a plot
aicsfromfulllong <- reshape(aicsfromfull, direction = 'long',
                            varying = c('dAIC_Jtu', 'dAIC_Jbeta', 'dAIC_Horn'),
                            v.names = 'dAIC',
                            idvar = 'mod',
                            timevar = 'type',
                            times = c('Jtu', 'Jbeta', 'Horn'))

trans = function(x) sign(x)*sqrt(abs(x))
aicsfromfulllong$dAIC_tr <- trans(aicsfromfulllong$dAIC)

# plot
xlims <- range(aicsfromfulllong$dAIC_tr, na.rm = TRUE)
xticks <- c(-10, 0, 10, 100, 1000, 10000)
par(mai = c(0.5, 3, 0.1, 0.1))
with(aicsfromfulllong[aicsfromfulllong$type == 'Jtu',], plot(dAIC_tr, nrow(aicsfromfull):1, 
                                                           col = 'light grey', xlim = xlims, yaxt = 'n', ylab = '', xaxt = 'n'))
with(aicsfromfulllong[aicsfromfulllong$type == 'Jbeta',], points(dAIC_tr, nrow(aicsfromfull):1 - 0.1, col = 'dark grey'))
with(aicsfromfulllong[aicsfromfulllong$type == 'Horn',], points(dAIC_tr, nrow(aicsfromfull):1 - 0.2, col = 'black'))
axis(2, at = nrow(aicsfromfull):1, labels = aicsfromfull$mod, las = 1, cex.axis = 0.7)
axis(1, at = trans(xticks), labels = xticks, cex.axis = 0.5)
abline(v = 0, lty =2, col = 'grey')

Light grey is for Jaccard turnover, dark grey is for Jaccard total, black is for Morisita-Horn. Clear that removing temperature trend makes the model quite a bit worse and has the biggest effect.

Simplify the full models

This takes a couple days on a laptop to run.

i1 <- trends[, complete.cases(Jtutrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]
i2 <- trends[, complete.cases(Jbetatrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]
i3 <- trends[, complete.cases(Horntrendrem0, REALM, tempave_metab.sc, seas.sc, microclim.sc, 
                             temptrend_abs.sc, mass.sc, speed.sc, 
                             consumerfrac.sc, nspp.sc, thermal_bias.sc, npp.sc, 
                             veg.sc, duration.sc, human_bowler.sc)]

randef <- list(STUDY_ID = ~ temptrend_abs.sc, rarefyID = ~1)
varef <- varPower(-0.5, ~nyrBT)

# simplify the full models
if(file.exists('temp/modTsimpJturem0.rds')){
  modTsimpJturem0 <- readRDS('temp/modTsimpJturem0.rds')
} else {
  modTfullJturem0ML <- lme(Jtutrendrem0 ~ temptrend_abs.sc*REALM + 
                         temptrend_abs.sc*tsign +
                         temptrend_abs.sc*tempave_metab.sc + 
                         temptrend_abs.sc*seas.sc + 
                         temptrend_abs.sc*microclim.sc + 
                         temptrend_abs.sc*mass.sc + 
                         temptrend_abs.sc*speed.sc + 
                         temptrend_abs.sc*consumerfrac.sc +
                         temptrend_abs.sc*nspp.sc +
                         temptrend_abs.sc*thermal_bias.sc:tsign +
                         temptrend_abs.sc*npp.sc +
                         temptrend_abs.sc*veg.sc +
                         temptrend_abs.sc*duration.sc +
                         temptrend_abs.sc*human_bowler.sc:REALM2,
                       random = randef, weights = varef, data = trends[i1,], method = 'ML',
                       control = lmeControl(maxIter = 100, msMaxIter = 100, niterEM = 50, msMaxEval = 500))
  modTsimpJturem0 <- stepAIC(modTfullJturem0ML, direction = 'backward')
  saveRDS(modTsimpJturem0, file = 'temp/modTsimpJturem0.rds')
}

if(file.exists('temp/modTsimpJbetarem0.rds')){
  modTsimpJbetarem0 <- readRDS('temp/modTsimpJbetarem0.rds')
} else {
  modTfullJbetarem0ML <- lme(Jbetatrendrem0 ~ temptrend_abs.sc*REALM + 
                         temptrend_abs.sc*tsign +
                         temptrend_abs.sc*tempave_metab.sc + 
                         temptrend_abs.sc*seas.sc + 
                         temptrend_abs.sc*microclim.sc + 
                         temptrend_abs.sc*mass.sc + 
                         temptrend_abs.sc*speed.sc + 
                         temptrend_abs.sc*consumerfrac.sc +
                         temptrend_abs.sc*nspp.sc +
                         temptrend_abs.sc*thermal_bias.sc:tsign +
                         temptrend_abs.sc*npp.sc +
                         temptrend_abs.sc*veg.sc +
                         temptrend_abs.sc*duration.sc +
                         temptrend_abs.sc*human_bowler.sc:REALM2,
                       random = randef, weights = varef, data = trends[i2,], method = 'ML')
  modTsimpJbetarem0 <- stepAIC(modTfullJbetarem0ML, direction = 'backward')
  saveRDS(modTsimpJbetarem0, file = 'temp/modTsimpJbetarem0.rds')
}

if(file.exists('temp/modTsimpHornrem0.rds')){
  modTsimpHornrem0 <- readRDS('temp/modTsimpHornrem0.rds')
} else {
  modTfullHornrem0ML <- lme(Horntrendrem0 ~ temptrend_abs.sc*REALM + 
                        temptrend_abs.sc*tsign +
                        temptrend_abs.sc*tempave_metab.sc + 
                        temptrend_abs.sc*seas.sc + 
                        temptrend_abs.sc*microclim.sc + 
                        temptrend_abs.sc*mass.sc + 
                        temptrend_abs.sc*speed.sc + 
                        temptrend_abs.sc*consumerfrac.sc +
                        temptrend_abs.sc*nspp.sc +
                        temptrend_abs.sc*thermal_bias.sc:tsign +
                        temptrend_abs.sc*npp.sc +
                        temptrend_abs.sc*veg.sc +
                        temptrend_abs.sc*duration.sc +
                        temptrend_abs.sc*human_bowler.sc:REALM2,
                      random = randef, weights = varef, data = trends[i3,], method = 'ML')
  modTsimpHornrem0 <- stepAIC(modTfullHornrem0ML, direction = 'backward')
  saveRDS(modTsimpHornrem0, file = 'temp/modTsimpHornrem0.rds')
}

summary(modTsimpJturem0)
summary(modTsimpJbetarem0)
summary(modTsimpHornrem0)

Make realm-specific models

summary(modTfullHornTerr)
Linear mixed-effects model fit by REML
 Data: trends[i1, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev      Corr  
(Intercept)      0.009555472 (Intr)
temptrend_abs.sc 0.022365121 0.313 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev: 0.004029061 1.695873

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.036154 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc * tsign + temptrend_abs.sc *      tempave_metab.sc + temptrend_abs.sc * seas.sc + temptrend_abs.sc *      microclim.sc + temptrend_abs.sc * mass.sc + temptrend_abs.sc *      speed.sc + temptrend_abs.sc * consumerfrac.sc + temptrend_abs.sc *      nspp.sc + temptrend_abs.sc * thermal_bias.sc:tsign + temptrend_abs.sc *      npp.sc + temptrend_abs.sc * veg.sc + temptrend_abs.sc * duration.sc +      temptrend_abs.sc * human_bowler.sc 
 Correlation: 
                                         (Intr) tmpt_. tsign1 tmpv_. ses.sc mcrcl. mss.sc spd.sc cnsmr.
temptrend_abs.sc                         -0.629                                                        
tsign1                                   -0.215  0.019                                                 
tempave_metab.sc                         -0.486  0.307 -0.209                                          
seas.sc                                  -0.258  0.267 -0.078  0.049                                   
microclim.sc                             -0.182  0.232  0.094 -0.018  0.473                            
mass.sc                                   0.515 -0.246 -0.010 -0.141  0.008  0.039                     
speed.sc                                  0.102  0.048 -0.033 -0.595 -0.025 -0.031 -0.141              
consumerfrac.sc                           0.356 -0.340  0.181  0.004 -0.048  0.072  0.424 -0.654       
nspp.sc                                  -0.064  0.025 -0.016 -0.061 -0.118 -0.161 -0.012  0.032  0.000
npp.sc                                   -0.044  0.007  0.118 -0.045  0.204  0.149  0.011  0.013 -0.007
veg.sc                                   -0.213  0.262 -0.078 -0.082 -0.069 -0.106  0.001  0.198 -0.160
duration.sc                              -0.098  0.042 -0.186  0.067  0.069 -0.016 -0.013 -0.051  0.138
human_bowler.sc                          -0.229  0.250  0.042  0.057 -0.059  0.150 -0.120  0.007 -0.147
temptrend_abs.sc:tsign1                   0.169 -0.306 -0.490  0.093 -0.109 -0.195  0.015  0.050 -0.111
temptrend_abs.sc:tempave_metab.sc         0.296 -0.503  0.138 -0.662 -0.039 -0.003  0.002  0.427 -0.032
temptrend_abs.sc:seas.sc                  0.219 -0.380  0.028 -0.025 -0.748 -0.378 -0.012  0.008  0.045
temptrend_abs.sc:microclim.sc             0.174 -0.290 -0.097  0.007 -0.367 -0.845 -0.034  0.038 -0.071
temptrend_abs.sc:mass.sc                 -0.313  0.361  0.005 -0.015 -0.041 -0.038 -0.642  0.280 -0.433
temptrend_abs.sc:speed.sc                 0.039  0.012  0.007  0.427  0.048  0.058  0.213 -0.732  0.560
temptrend_abs.sc:consumerfrac.sc         -0.283  0.407 -0.096 -0.047 -0.009 -0.066 -0.336  0.552 -0.784
temptrend_abs.sc:nspp.sc                  0.025 -0.086  0.006  0.050  0.053  0.060 -0.005  0.003 -0.014
tsign-1:thermal_bias.sc                  -0.091 -0.062  0.667 -0.179 -0.286 -0.090  0.013 -0.024  0.140
tsign1:thermal_bias.sc                    0.212 -0.208 -0.065 -0.033 -0.666 -0.403  0.049  0.039 -0.026
temptrend_abs.sc:npp.sc                   0.027  0.023 -0.116  0.050 -0.131 -0.072 -0.023 -0.018  0.004
temptrend_abs.sc:veg.sc                   0.225 -0.308  0.055  0.044  0.027  0.048  0.031 -0.133  0.116
temptrend_abs.sc:duration.sc             -0.064  0.147  0.020 -0.086 -0.033  0.033  0.001  0.020 -0.059
temptrend_abs.sc:human_bowler.sc          0.242 -0.331 -0.037 -0.055 -0.037 -0.159  0.096  0.004  0.106
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.049 -0.049 -0.379  0.107  0.218  0.025 -0.004  0.036 -0.095
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.140  0.284  0.118 -0.001  0.450  0.297 -0.010 -0.009  0.032
                                         nspp.s npp.sc veg.sc drtn.s hmn_b. tm_.:1 tmptrnd_bs.sc:t_.
temptrend_abs.sc                                                                                    
tsign1                                                                                              
tempave_metab.sc                                                                                    
seas.sc                                                                                             
microclim.sc                                                                                        
mass.sc                                                                                             
speed.sc                                                                                            
consumerfrac.sc                                                                                     
nspp.sc                                                                                             
npp.sc                                   -0.064                                                     
veg.sc                                   -0.038 -0.553                                              
duration.sc                              -0.012 -0.020 -0.022                                       
human_bowler.sc                           0.019 -0.190  0.287 -0.127                                
temptrend_abs.sc:tsign1                  -0.013 -0.123  0.012  0.122 -0.120                         
temptrend_abs.sc:tempave_metab.sc         0.065  0.034  0.059 -0.090 -0.025 -0.077                  
temptrend_abs.sc:seas.sc                  0.073 -0.106  0.012 -0.028 -0.077  0.146  0.033           
temptrend_abs.sc:microclim.sc             0.090 -0.089  0.054  0.026 -0.139  0.232  0.001           
temptrend_abs.sc:mass.sc                  0.018 -0.026  0.020  0.031  0.088  0.053  0.063           
temptrend_abs.sc:speed.sc                -0.016 -0.007 -0.133  0.034  0.004 -0.073 -0.598           
temptrend_abs.sc:consumerfrac.sc          0.017  0.007  0.087 -0.118  0.068  0.101  0.017           
temptrend_abs.sc:nspp.sc                 -0.603  0.011  0.028 -0.007  0.055  0.019 -0.015           
tsign-1:thermal_bias.sc                   0.004  0.115 -0.079 -0.062  0.055 -0.214  0.119           
tsign1:thermal_bias.sc                   -0.028  0.143 -0.091 -0.017  0.084  0.301  0.012           
temptrend_abs.sc:npp.sc                   0.003 -0.880  0.494  0.021  0.147  0.149 -0.046           
temptrend_abs.sc:veg.sc                   0.013  0.504 -0.847  0.026 -0.301 -0.005 -0.071           
temptrend_abs.sc:duration.sc              0.152  0.001  0.010 -0.250  0.105 -0.223  0.094           
temptrend_abs.sc:human_bowler.sc          0.032  0.135 -0.334  0.116 -0.798  0.151  0.051           
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.015 -0.268  0.129  0.041 -0.116  0.635 -0.107           
temptrend_abs.sc:tsign1:thermal_bias.sc   0.026 -0.186  0.122 -0.028 -0.006 -0.369 -0.014           
                                         tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc. tmptrnd_bs.sc:ms.
temptrend_abs.sc                                                                              
tsign1                                                                                        
tempave_metab.sc                                                                              
seas.sc                                                                                       
microclim.sc                                                                                  
mass.sc                                                                                       
speed.sc                                                                                      
consumerfrac.sc                                                                               
nspp.sc                                                                                       
npp.sc                                                                                        
veg.sc                                                                                        
duration.sc                                                                                   
human_bowler.sc                                                                               
temptrend_abs.sc:tsign1                                                                       
temptrend_abs.sc:tempave_metab.sc                                                             
temptrend_abs.sc:seas.sc                                                                      
temptrend_abs.sc:microclim.sc             0.453                                               
temptrend_abs.sc:mass.sc                  0.028             0.039                             
temptrend_abs.sc:speed.sc                -0.029            -0.063            -0.439           
temptrend_abs.sc:consumerfrac.sc         -0.017             0.081             0.549           
temptrend_abs.sc:nspp.sc                 -0.055            -0.058             0.002           
tsign-1:thermal_bias.sc                   0.198             0.050             0.011           
tsign1:thermal_bias.sc                    0.496             0.298             0.021           
temptrend_abs.sc:npp.sc                   0.078             0.074             0.011           
temptrend_abs.sc:veg.sc                   0.016            -0.034            -0.028           
temptrend_abs.sc:duration.sc              0.012            -0.038            -0.011           
temptrend_abs.sc:human_bowler.sc          0.066             0.201            -0.080           
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.305            -0.022             0.054           
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.615            -0.339            -0.018           
                                         tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c. tmptrnd_bs.sc:ns. t-1:_.
temptrend_abs.sc                                                                                    
tsign1                                                                                              
tempave_metab.sc                                                                                    
seas.sc                                                                                             
microclim.sc                                                                                        
mass.sc                                                                                             
speed.sc                                                                                            
consumerfrac.sc                                                                                     
nspp.sc                                                                                             
npp.sc                                                                                              
veg.sc                                                                                              
duration.sc                                                                                         
human_bowler.sc                                                                                     
temptrend_abs.sc:tsign1                                                                             
temptrend_abs.sc:tempave_metab.sc                                                                   
temptrend_abs.sc:seas.sc                                                                            
temptrend_abs.sc:microclim.sc                                                                       
temptrend_abs.sc:mass.sc                                                                            
temptrend_abs.sc:speed.sc                                                                           
temptrend_abs.sc:consumerfrac.sc         -0.699                                                     
temptrend_abs.sc:nspp.sc                 -0.032             0.012                                   
tsign-1:thermal_bias.sc                  -0.014            -0.061            0.022                  
tsign1:thermal_bias.sc                   -0.027             0.039            0.049             0.281
temptrend_abs.sc:npp.sc                   0.033            -0.034           -0.024            -0.123
temptrend_abs.sc:veg.sc                   0.147            -0.097           -0.050             0.076
temptrend_abs.sc:duration.sc             -0.015             0.043           -0.259             0.026
temptrend_abs.sc:human_bowler.sc         -0.030            -0.066           -0.053            -0.040
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.045             0.083           -0.009            -0.457
temptrend_abs.sc:tsign1:thermal_bias.sc   0.016            -0.024           -0.077            -0.196
                                         ts1:_. tmptrnd_bs.sc:np. tmptrnd_bs.sc:v. tmptrnd_bs.sc:d.
temptrend_abs.sc                                                                                   
tsign1                                                                                             
tempave_metab.sc                                                                                   
seas.sc                                                                                            
microclim.sc                                                                                       
mass.sc                                                                                            
speed.sc                                                                                           
consumerfrac.sc                                                                                    
nspp.sc                                                                                            
npp.sc                                                                                             
veg.sc                                                                                             
duration.sc                                                                                        
human_bowler.sc                                                                                    
temptrend_abs.sc:tsign1                                                                            
temptrend_abs.sc:tempave_metab.sc                                                                  
temptrend_abs.sc:seas.sc                                                                           
temptrend_abs.sc:microclim.sc                                                                      
temptrend_abs.sc:mass.sc                                                                           
temptrend_abs.sc:speed.sc                                                                          
temptrend_abs.sc:consumerfrac.sc                                                                   
temptrend_abs.sc:nspp.sc                                                                           
tsign-1:thermal_bias.sc                                                                            
tsign1:thermal_bias.sc                                                                             
temptrend_abs.sc:npp.sc                  -0.152                                                    
temptrend_abs.sc:veg.sc                   0.111 -0.609                                             
temptrend_abs.sc:duration.sc             -0.064 -0.005             0.004                           
temptrend_abs.sc:human_bowler.sc         -0.044 -0.180             0.418           -0.105          
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.267  0.311            -0.156           -0.092          
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.831  0.198            -0.155            0.085          
                                         tmptrnd_bs.sc:h_. t_.:-1
temptrend_abs.sc                                                 
tsign1                                                           
tempave_metab.sc                                                 
seas.sc                                                          
microclim.sc                                                     
mass.sc                                                          
speed.sc                                                         
consumerfrac.sc                                                  
nspp.sc                                                          
npp.sc                                                           
veg.sc                                                           
duration.sc                                                      
human_bowler.sc                                                  
temptrend_abs.sc:tsign1                                          
temptrend_abs.sc:tempave_metab.sc                                
temptrend_abs.sc:seas.sc                                         
temptrend_abs.sc:microclim.sc                                    
temptrend_abs.sc:mass.sc                                         
temptrend_abs.sc:speed.sc                                        
temptrend_abs.sc:consumerfrac.sc                                 
temptrend_abs.sc:nspp.sc                                         
tsign-1:thermal_bias.sc                                          
tsign1:thermal_bias.sc                                           
temptrend_abs.sc:npp.sc                                          
temptrend_abs.sc:veg.sc                                          
temptrend_abs.sc:duration.sc                                     
temptrend_abs.sc:human_bowler.sc                                 
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.169                  
temptrend_abs.sc:tsign1:thermal_bias.sc   0.038             0.319

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.32506581 -0.38770014 -0.04491269  0.36618931  5.19217938 

Number of Observations: 2299
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                    90                   2299 
summary(modTfullHornFresh)
Linear mixed-effects model fit by REML
 Data: trends[i2, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev       Corr  
(Intercept)      3.088553e-08 (Intr)
temptrend_abs.sc 2.055026e-02 0.025 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.02085277  2.44783

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.345198 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc * tsign + temptrend_abs.sc *      tempave_metab.sc + temptrend_abs.sc * seas.sc + temptrend_abs.sc *      microclim.sc + temptrend_abs.sc * mass.sc + temptrend_abs.sc *      speed.sc + temptrend_abs.sc * nspp.sc + temptrend_abs.sc *      thermal_bias.sc:tsign + temptrend_abs.sc * npp.sc + temptrend_abs.sc *      veg.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc 
 Correlation: 
                                         (Intr) tmpt_. tsign1 tmpv_. ses.sc mcrcl. mss.sc spd.sc nspp.s
temptrend_abs.sc                         -0.602                                                        
tsign1                                   -0.231  0.096                                                 
tempave_metab.sc                          0.484 -0.185  0.121                                          
seas.sc                                   0.008 -0.055  0.022  0.354                                   
microclim.sc                             -0.132  0.056  0.107  0.381  0.099                            
mass.sc                                  -0.034  0.042 -0.073 -0.301  0.196 -0.393                     
speed.sc                                  0.241 -0.155  0.004  0.232  0.111  0.078 -0.670              
nspp.sc                                   0.125 -0.007 -0.163 -0.343 -0.442 -0.166  0.205 -0.078       
npp.sc                                   -0.272 -0.025  0.019 -0.132  0.452  0.147  0.096 -0.007 -0.032
veg.sc                                   -0.543  0.574 -0.027 -0.010 -0.068 -0.128 -0.108  0.065 -0.146
duration.sc                              -0.134  0.121 -0.187  0.102 -0.026  0.072 -0.112  0.023 -0.208
human_bowler.sc                           0.065  0.062 -0.078 -0.106 -0.267 -0.011  0.165 -0.105 -0.048
temptrend_abs.sc:tsign1                   0.171 -0.362 -0.534 -0.016 -0.013 -0.007 -0.046  0.047  0.081
temptrend_abs.sc:tempave_metab.sc        -0.159  0.098 -0.029 -0.614 -0.427 -0.311  0.204 -0.189  0.196
temptrend_abs.sc:seas.sc                 -0.021  0.063  0.027 -0.352 -0.697 -0.152 -0.026 -0.180  0.187
temptrend_abs.sc:microclim.sc             0.039  0.000  0.013 -0.258 -0.174 -0.622  0.213 -0.074  0.034
temptrend_abs.sc:mass.sc                 -0.016 -0.069 -0.010  0.150 -0.015  0.239 -0.674  0.446 -0.105
temptrend_abs.sc:speed.sc                -0.130  0.244  0.058 -0.123 -0.179 -0.049  0.420 -0.644  0.022
temptrend_abs.sc:nspp.sc                 -0.072 -0.009  0.157  0.177  0.134  0.083 -0.160 -0.005 -0.624
tsign-1:thermal_bias.sc                   0.429 -0.242 -0.411  0.253  0.043  0.065 -0.035  0.048  0.091
tsign1:thermal_bias.sc                    0.218 -0.069  0.138  0.581  0.367  0.124  0.040  0.015 -0.204
temptrend_abs.sc:npp.sc                   0.014  0.271  0.009 -0.067 -0.351 -0.074 -0.028 -0.023  0.022
temptrend_abs.sc:veg.sc                   0.354 -0.817  0.020 -0.011  0.016  0.060  0.023 -0.036  0.006
temptrend_abs.sc:duration.sc              0.043 -0.011 -0.037  0.044  0.153  0.060  0.045  0.061  0.117
temptrend_abs.sc:human_bowler.sc         -0.018 -0.038  0.025  0.193  0.275  0.108 -0.232  0.190  0.007
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.223  0.440  0.187 -0.198 -0.170 -0.066  0.098 -0.065  0.040
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.099  0.022 -0.106 -0.344 -0.342 -0.044 -0.075 -0.026  0.075
                                         npp.sc veg.sc drtn.s hmn_b. tm_.:1 tmptrnd_bs.sc:t_.
temptrend_abs.sc                                                                             
tsign1                                                                                       
tempave_metab.sc                                                                             
seas.sc                                                                                      
microclim.sc                                                                                 
mass.sc                                                                                      
speed.sc                                                                                     
nspp.sc                                                                                      
npp.sc                                                                                       
veg.sc                                   -0.358                                              
duration.sc                               0.041  0.119                                       
human_bowler.sc                          -0.123  0.057  0.041                                
temptrend_abs.sc:tsign1                  -0.018 -0.047  0.054 -0.032                         
temptrend_abs.sc:tempave_metab.sc        -0.151 -0.024 -0.045  0.298 -0.040                  
temptrend_abs.sc:seas.sc                 -0.353  0.010  0.000  0.322 -0.050  0.779           
temptrend_abs.sc:microclim.sc            -0.108  0.098 -0.008  0.118 -0.070  0.524           
temptrend_abs.sc:mass.sc                  0.021  0.040  0.076 -0.298  0.097 -0.376           
temptrend_abs.sc:speed.sc                -0.042 -0.028  0.001  0.200 -0.093  0.226           
temptrend_abs.sc:nspp.sc                 -0.031  0.046  0.116 -0.059 -0.111 -0.251           
tsign-1:thermal_bias.sc                   0.126 -0.256  0.003  0.055  0.244 -0.183           
tsign1:thermal_bias.sc                    0.124  0.060  0.027  0.188 -0.140 -0.399           
temptrend_abs.sc:npp.sc                  -0.690  0.340 -0.066  0.117  0.033  0.341           
temptrend_abs.sc:veg.sc                   0.244 -0.692 -0.075 -0.037  0.106  0.071           
temptrend_abs.sc:duration.sc              0.044 -0.090 -0.342 -0.061  0.021 -0.044           
temptrend_abs.sc:human_bowler.sc          0.116  0.005 -0.030 -0.709  0.056 -0.499           
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.246  0.236 -0.021  0.087 -0.477  0.423           
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.216 -0.030  0.076 -0.004  0.173  0.585           
                                         tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc. tmptrnd_bs.sc:ms.
temptrend_abs.sc                                                                              
tsign1                                                                                        
tempave_metab.sc                                                                              
seas.sc                                                                                       
microclim.sc                                                                                  
mass.sc                                                                                       
speed.sc                                                                                      
nspp.sc                                                                                       
npp.sc                                                                                        
veg.sc                                                                                        
duration.sc                                                                                   
human_bowler.sc                                                                               
temptrend_abs.sc:tsign1                                                                       
temptrend_abs.sc:tempave_metab.sc                                                             
temptrend_abs.sc:seas.sc                                                                      
temptrend_abs.sc:microclim.sc             0.397                                               
temptrend_abs.sc:mass.sc                 -0.201            -0.358                             
temptrend_abs.sc:speed.sc                 0.319             0.166            -0.674           
temptrend_abs.sc:nspp.sc                 -0.150            -0.005             0.180           
tsign-1:thermal_bias.sc                  -0.117            -0.061             0.052           
tsign1:thermal_bias.sc                   -0.320            -0.052            -0.104           
temptrend_abs.sc:npp.sc                   0.459             0.196            -0.075           
temptrend_abs.sc:veg.sc                   0.032            -0.138            -0.023           
temptrend_abs.sc:duration.sc             -0.210            -0.189            -0.003           
temptrend_abs.sc:human_bowler.sc         -0.501            -0.182             0.480           
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.374             0.182            -0.228           
temptrend_abs.sc:tsign1:thermal_bias.sc   0.520             0.087             0.003           
                                         tmptrnd_bs.sc:sp. tmptrnd_bs.sc:ns. t-1:_. ts1:_.
temptrend_abs.sc                                                                          
tsign1                                                                                    
tempave_metab.sc                                                                          
seas.sc                                                                                   
microclim.sc                                                                              
mass.sc                                                                                   
speed.sc                                                                                  
nspp.sc                                                                                   
npp.sc                                                                                    
veg.sc                                                                                    
duration.sc                                                                               
human_bowler.sc                                                                           
temptrend_abs.sc:tsign1                                                                   
temptrend_abs.sc:tempave_metab.sc                                                         
temptrend_abs.sc:seas.sc                                                                  
temptrend_abs.sc:microclim.sc                                                             
temptrend_abs.sc:mass.sc                                                                  
temptrend_abs.sc:speed.sc                                                                 
temptrend_abs.sc:nspp.sc                  0.016                                           
tsign-1:thermal_bias.sc                  -0.035            -0.028                         
tsign1:thermal_bias.sc                    0.034             0.041             0.196       
temptrend_abs.sc:npp.sc                   0.013             0.050            -0.173 -0.199
temptrend_abs.sc:veg.sc                   0.016            -0.022             0.144 -0.042
temptrend_abs.sc:duration.sc             -0.108            -0.279             0.071  0.059
temptrend_abs.sc:human_bowler.sc         -0.329             0.004            -0.006 -0.029
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.072            -0.085            -0.534 -0.177
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.045            -0.045            -0.159 -0.711
                                         tmptrnd_bs.sc:np. tmptrnd_bs.sc:v. tmptrnd_bs.sc:d.
temptrend_abs.sc                                                                            
tsign1                                                                                      
tempave_metab.sc                                                                            
seas.sc                                                                                     
microclim.sc                                                                                
mass.sc                                                                                     
speed.sc                                                                                    
nspp.sc                                                                                     
npp.sc                                                                                      
veg.sc                                                                                      
duration.sc                                                                                 
human_bowler.sc                                                                             
temptrend_abs.sc:tsign1                                                                     
temptrend_abs.sc:tempave_metab.sc                                                           
temptrend_abs.sc:seas.sc                                                                    
temptrend_abs.sc:microclim.sc                                                               
temptrend_abs.sc:mass.sc                                                                    
temptrend_abs.sc:speed.sc                                                                   
temptrend_abs.sc:nspp.sc                                                                    
tsign-1:thermal_bias.sc                                                                     
tsign1:thermal_bias.sc                                                                      
temptrend_abs.sc:npp.sc                                                                     
temptrend_abs.sc:veg.sc                  -0.513                                             
temptrend_abs.sc:duration.sc             -0.047             0.116                           
temptrend_abs.sc:human_bowler.sc         -0.145            -0.075            0.053          
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.494            -0.339           -0.057          
temptrend_abs.sc:tsign1:thermal_bias.sc   0.411             0.068           -0.056          
                                         tmptrnd_bs.sc:h_. t_.:-1
temptrend_abs.sc                                                 
tsign1                                                           
tempave_metab.sc                                                 
seas.sc                                                          
microclim.sc                                                     
mass.sc                                                          
speed.sc                                                         
nspp.sc                                                          
npp.sc                                                           
veg.sc                                                           
duration.sc                                                      
human_bowler.sc                                                  
temptrend_abs.sc:tsign1                                          
temptrend_abs.sc:tempave_metab.sc                                
temptrend_abs.sc:seas.sc                                         
temptrend_abs.sc:microclim.sc                                    
temptrend_abs.sc:mass.sc                                         
temptrend_abs.sc:speed.sc                                        
temptrend_abs.sc:nspp.sc                                         
tsign-1:thermal_bias.sc                                          
tsign1:thermal_bias.sc                                           
temptrend_abs.sc:npp.sc                                          
temptrend_abs.sc:veg.sc                                          
temptrend_abs.sc:duration.sc                                     
temptrend_abs.sc:human_bowler.sc                                 
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.153                  
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.145             0.337

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-4.25987257 -0.29069598 -0.02883191  0.25023757  5.23849247 

Number of Observations: 608
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                    18                    608 
summary(modTfullHornMar)
Linear mixed-effects model fit by REML
 Data: trends[i3, ] 

Random effects:
 Formula: ~temptrend_abs.sc | STUDY_ID
 Structure: General positive-definite, Log-Cholesky parametrization
                 StdDev     Corr  
(Intercept)      0.02167793 (Intr)
temptrend_abs.sc 0.02656924 0.035 

 Formula: ~1 | rarefyID %in% STUDY_ID
        (Intercept) Residual
StdDev:  0.02055808 2.782391

Variance function:
 Structure: Power of variance covariate
 Formula: ~nyrBT 
 Parameter estimates:
    power 
-2.432839 
Fixed effects: Horntrendrem0 ~ temptrend_abs.sc * tsign + temptrend_abs.sc *      tempave_metab.sc + temptrend_abs.sc * seas.sc + temptrend_abs.sc *      microclim.sc + temptrend_abs.sc * mass.sc + temptrend_abs.sc *      speed.sc + temptrend_abs.sc * consumerfrac.sc + temptrend_abs.sc *      nspp.sc + temptrend_abs.sc * thermal_bias.sc:tsign + temptrend_abs.sc *      npp.sc + temptrend_abs.sc * duration.sc + temptrend_abs.sc *      human_bowler.sc 
 Correlation: 
                                         (Intr) tmpt_. tsign1 tmpv_. ses.sc mcrcl. mss.sc spd.sc cnsmr.
temptrend_abs.sc                         -0.263                                                        
tsign1                                   -0.188  0.115                                                 
tempave_metab.sc                          0.102 -0.003  0.022                                          
seas.sc                                   0.185 -0.084 -0.091  0.221                                   
microclim.sc                              0.037 -0.045  0.008 -0.204  0.067                            
mass.sc                                   0.058 -0.033  0.000  0.062  0.037  0.012                     
speed.sc                                  0.153 -0.080 -0.079  0.072  0.073  0.039 -0.434              
consumerfrac.sc                           0.000  0.012  0.029 -0.068 -0.012  0.012 -0.055  0.000       
nspp.sc                                  -0.131  0.096  0.058 -0.114  0.092 -0.084 -0.105  0.204  0.112
npp.sc                                   -0.043  0.057 -0.002 -0.053 -0.345 -0.238 -0.024  0.081 -0.040
duration.sc                               0.041 -0.022 -0.137  0.053 -0.064 -0.016 -0.001 -0.016 -0.016
human_bowler.sc                          -0.030  0.030  0.005  0.098 -0.193  0.005 -0.026  0.040 -0.055
temptrend_abs.sc:tsign1                   0.089 -0.249 -0.520 -0.048 -0.009 -0.003  0.008  0.032 -0.017
temptrend_abs.sc:tempave_metab.sc        -0.031  0.078 -0.081 -0.437 -0.161  0.032 -0.019  0.058  0.040
temptrend_abs.sc:seas.sc                 -0.078  0.140  0.048 -0.144 -0.689 -0.051 -0.018 -0.038 -0.016
temptrend_abs.sc:microclim.sc            -0.022  0.066 -0.016  0.131 -0.010 -0.723  0.014 -0.028 -0.003
temptrend_abs.sc:mass.sc                  0.002  0.093  0.012 -0.038 -0.016  0.026 -0.573  0.252  0.060
temptrend_abs.sc:speed.sc                -0.031  0.176  0.047  0.026 -0.018 -0.039  0.237 -0.575  0.016
temptrend_abs.sc:consumerfrac.sc         -0.013 -0.027 -0.018  0.051  0.006  0.017  0.052  0.007 -0.719
temptrend_abs.sc:nspp.sc                  0.038 -0.174 -0.024  0.031 -0.065  0.046  0.026 -0.170 -0.064
tsign-1:thermal_bias.sc                   0.037  0.000 -0.166  0.241 -0.140 -0.031 -0.046  0.047 -0.004
tsign1:thermal_bias.sc                    0.006 -0.004  0.129  0.432 -0.171 -0.128 -0.002  0.027 -0.005
temptrend_abs.sc:npp.sc                   0.007 -0.082  0.014  0.031  0.208  0.182 -0.009 -0.036  0.014
temptrend_abs.sc:duration.sc             -0.104  0.249  0.028  0.111  0.011 -0.038  0.036  0.016  0.030
temptrend_abs.sc:human_bowler.sc          0.029 -0.029 -0.017 -0.067  0.145 -0.007  0.023 -0.033  0.133
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.012  0.010  0.028 -0.091  0.105  0.023  0.013  0.009 -0.003
temptrend_abs.sc:tsign1:thermal_bias.sc   0.006 -0.004 -0.104 -0.174  0.072  0.038  0.012  0.042 -0.019
                                         nspp.s npp.sc drtn.s hmn_b. tm_.:1 tmptrnd_bs.sc:t_.
temptrend_abs.sc                                                                             
tsign1                                                                                       
tempave_metab.sc                                                                             
seas.sc                                                                                      
microclim.sc                                                                                 
mass.sc                                                                                      
speed.sc                                                                                     
consumerfrac.sc                                                                              
nspp.sc                                                                                      
npp.sc                                   -0.237                                              
duration.sc                              -0.279  0.065                                       
human_bowler.sc                          -0.051 -0.158  0.018                                
temptrend_abs.sc:tsign1                  -0.036 -0.002  0.018 -0.006                         
temptrend_abs.sc:tempave_metab.sc         0.038  0.018  0.022 -0.044  0.092                  
temptrend_abs.sc:seas.sc                 -0.057  0.261  0.016  0.155  0.013  0.196           
temptrend_abs.sc:microclim.sc             0.052  0.180  0.004 -0.028 -0.019  0.029           
temptrend_abs.sc:mass.sc                  0.028 -0.019  0.033  0.031 -0.013  0.041           
temptrend_abs.sc:speed.sc                -0.167 -0.017  0.027 -0.043 -0.019 -0.156           
temptrend_abs.sc:consumerfrac.sc         -0.087  0.016 -0.004  0.075  0.046 -0.049           
temptrend_abs.sc:nspp.sc                 -0.643  0.144  0.179  0.044  0.032 -0.064           
tsign-1:thermal_bias.sc                  -0.055 -0.011  0.077  0.141  0.042 -0.054           
tsign1:thermal_bias.sc                   -0.059 -0.118  0.093  0.170 -0.076 -0.125           
temptrend_abs.sc:npp.sc                   0.133 -0.656 -0.036  0.097 -0.050 -0.027           
temptrend_abs.sc:duration.sc              0.253 -0.038 -0.484  0.034 -0.079 -0.042           
temptrend_abs.sc:human_bowler.sc          0.039  0.105 -0.005 -0.735  0.018  0.089           
temptrend_abs.sc:tsign-1:thermal_bias.sc  0.008 -0.003 -0.030 -0.083  0.059  0.277           
temptrend_abs.sc:tsign1:thermal_bias.sc   0.015  0.082 -0.046 -0.122  0.164  0.469           
                                         tmptrnd_bs.sc:ss. tmptrnd_bs.sc:mc. tmptrnd_bs.sc:ms.
temptrend_abs.sc                                                                              
tsign1                                                                                        
tempave_metab.sc                                                                              
seas.sc                                                                                       
microclim.sc                                                                                  
mass.sc                                                                                       
speed.sc                                                                                      
consumerfrac.sc                                                                               
nspp.sc                                                                                       
npp.sc                                                                                        
duration.sc                                                                                   
human_bowler.sc                                                                               
temptrend_abs.sc:tsign1                                                                       
temptrend_abs.sc:tempave_metab.sc                                                             
temptrend_abs.sc:seas.sc                                                                      
temptrend_abs.sc:microclim.sc             0.053                                               
temptrend_abs.sc:mass.sc                  0.005            -0.063                             
temptrend_abs.sc:speed.sc                 0.067             0.051            -0.412           
temptrend_abs.sc:consumerfrac.sc         -0.029            -0.039            -0.112           
temptrend_abs.sc:nspp.sc                  0.061            -0.014            -0.009           
tsign-1:thermal_bias.sc                   0.091             0.011             0.023           
tsign1:thermal_bias.sc                    0.065             0.049             0.017           
temptrend_abs.sc:npp.sc                  -0.379            -0.338             0.065           
temptrend_abs.sc:duration.sc             -0.046             0.044            -0.068           
temptrend_abs.sc:human_bowler.sc         -0.171            -0.022            -0.025           
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.127            -0.034            -0.014           
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.069            -0.123            -0.016           
                                         tmptrnd_bs.sc:sp. tmptrnd_bs.sc:c. tmptrnd_bs.sc:ns. t-1:_.
temptrend_abs.sc                                                                                    
tsign1                                                                                              
tempave_metab.sc                                                                                    
seas.sc                                                                                             
microclim.sc                                                                                        
mass.sc                                                                                             
speed.sc                                                                                            
consumerfrac.sc                                                                                     
nspp.sc                                                                                             
npp.sc                                                                                              
duration.sc                                                                                         
human_bowler.sc                                                                                     
temptrend_abs.sc:tsign1                                                                             
temptrend_abs.sc:tempave_metab.sc                                                                   
temptrend_abs.sc:seas.sc                                                                            
temptrend_abs.sc:microclim.sc                                                                       
temptrend_abs.sc:mass.sc                                                                            
temptrend_abs.sc:speed.sc                                                                           
temptrend_abs.sc:consumerfrac.sc         -0.042                                                     
temptrend_abs.sc:nspp.sc                  0.212             0.115                                   
tsign-1:thermal_bias.sc                  -0.015            -0.001            0.009                  
tsign1:thermal_bias.sc                   -0.004             0.002            0.000             0.358
temptrend_abs.sc:npp.sc                  -0.012            -0.003           -0.152            -0.005
temptrend_abs.sc:duration.sc             -0.044             0.024           -0.356            -0.028
temptrend_abs.sc:human_bowler.sc          0.038            -0.153           -0.057            -0.092
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.047             0.029           -0.009            -0.482
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.124             0.050           -0.033            -0.177
                                         ts1:_. tmptrnd_bs.sc:np. tmptrnd_bs.sc:d. tmptrnd_bs.sc:h_.
temptrend_abs.sc                                                                                    
tsign1                                                                                              
tempave_metab.sc                                                                                    
seas.sc                                                                                             
microclim.sc                                                                                        
mass.sc                                                                                             
speed.sc                                                                                            
consumerfrac.sc                                                                                     
nspp.sc                                                                                             
npp.sc                                                                                              
duration.sc                                                                                         
human_bowler.sc                                                                                     
temptrend_abs.sc:tsign1                                                                             
temptrend_abs.sc:tempave_metab.sc                                                                   
temptrend_abs.sc:seas.sc                                                                            
temptrend_abs.sc:microclim.sc                                                                       
temptrend_abs.sc:mass.sc                                                                            
temptrend_abs.sc:speed.sc                                                                           
temptrend_abs.sc:consumerfrac.sc                                                                    
temptrend_abs.sc:nspp.sc                                                                            
tsign-1:thermal_bias.sc                                                                             
tsign1:thermal_bias.sc                                                                              
temptrend_abs.sc:npp.sc                   0.086                                                     
temptrend_abs.sc:duration.sc             -0.055  0.054                                              
temptrend_abs.sc:human_bowler.sc         -0.124 -0.140            -0.020                            
temptrend_abs.sc:tsign-1:thermal_bias.sc -0.174  0.011             0.066            0.087           
temptrend_abs.sc:tsign1:thermal_bias.sc  -0.571 -0.084             0.037            0.137           
                                         t_.:-1
temptrend_abs.sc                               
tsign1                                         
tempave_metab.sc                               
seas.sc                                        
microclim.sc                                   
mass.sc                                        
speed.sc                                       
consumerfrac.sc                                
nspp.sc                                        
npp.sc                                         
duration.sc                                    
human_bowler.sc                                
temptrend_abs.sc:tsign1                        
temptrend_abs.sc:tempave_metab.sc              
temptrend_abs.sc:seas.sc                       
temptrend_abs.sc:microclim.sc                  
temptrend_abs.sc:mass.sc                       
temptrend_abs.sc:speed.sc                      
temptrend_abs.sc:consumerfrac.sc               
temptrend_abs.sc:nspp.sc                       
tsign-1:thermal_bias.sc                        
tsign1:thermal_bias.sc                         
temptrend_abs.sc:npp.sc                        
temptrend_abs.sc:duration.sc                   
temptrend_abs.sc:human_bowler.sc               
temptrend_abs.sc:tsign-1:thermal_bias.sc       
temptrend_abs.sc:tsign1:thermal_bias.sc   0.341

Standardized Within-Group Residuals:
        Min          Q1         Med          Q3         Max 
-5.59847381 -0.21790065 -0.02487884  0.21515504  5.76491820 

Number of Observations: 32420
Number of Groups: 
              STUDY_ID rarefyID %in% STUDY_ID 
                    92                  32420 

Plot the realm-specific coefficients

Also uses the full models across all realms


coefs1 <- summary(modTfullHornrem0)$tTable
coefs2 <- summary(modTfullHornTerr)$tTable
coefs3 <- summary(modTfullHornFresh)$tTable
coefs4 <- summary(modTfullHornMar)$tTable

varstoplot <- unique(c(rownames(coefs1), rownames(coefs2), rownames(coefs3), rownames(coefs4)))
varstoplot <- varstoplot[which(!grepl('Intercept', varstoplot) | grepl(':', varstoplot))] # vars to plot

rows1_1 <- which(rownames(coefs1) %in% varstoplot) # rows in coefs
rows1_2 <- which(rownames(coefs2) %in% varstoplot)
rows1_3 <- which(rownames(coefs3) %in% varstoplot)
rows1_4 <- which(rownames(coefs4) %in% varstoplot)
xlims <- range(c(coefs1[rows1_1,1] - coefs1[rows1_1,2], coefs1[rows1_1,1] + coefs1[rows1_1,2], 
                 coefs2[rows1_2,1] - coefs2[rows1_2,2], coefs2[rows1_2,1] + coefs2[rows1_2,2], 
                 coefs3[rows1_3,1] - coefs3[rows1_3,2], coefs3[rows1_3,1] + coefs3[rows1_3,2],
                 coefs4[rows1_4,1] - coefs4[rows1_4,2], coefs4[rows1_4,1] + coefs4[rows1_4,2]))


cols <- brewer.pal(4, 'Dark2') # for full, terr, fresh, mar
pchs <- c(1, 16, 16, 16)
offs <- c(0.1, 0, -0.1, -0.2) # offset vertically for each model


par(las = 1, mai = c(0.5, 4, 0.1, 0.1))

plot(0,0, col = 'white', xlim = xlims, ylim = c(1,length(varstoplot)), yaxt='n', xlab = '', ylab ='')
axis(2, at = length(varstoplot):1, labels = varstoplot, cex.axis = 0.7)
abline(v = 0, col = 'grey', lty = 2)
abline(h = 1:length(varstoplot), col = 'grey', lty = 3)
for(i in 1:length(varstoplot)){
  if(varstoplot[i] %in% rownames(coefs1)){
    x = coefs1[rownames(coefs1) == varstoplot[i], 1]
    se = coefs1[rownames(coefs1) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[1], pch = pchs[1], col = cols[1])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[1], length(varstoplot) + 1 - i + offs[1]), col = cols[1])
  }
  if(varstoplot[i] %in% rownames(coefs2)){
    x = coefs2[rownames(coefs2) == varstoplot[i], 1]
    se = coefs2[rownames(coefs2) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[2], pch = pchs[2], col = cols[2])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[2], length(varstoplot) + 1 - i + offs[2]), col = cols[2])
  }
  if(varstoplot[i] %in% rownames(coefs3)){
    x = coefs3[rownames(coefs3) == varstoplot[i], 1]
    se = coefs3[rownames(coefs3) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[3], pch = pchs[3], col = cols[3])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[3], length(varstoplot) + 1 - i + offs[3]), col = cols[3])
  }
  if(varstoplot[i] %in% rownames(coefs4)){
    x = coefs4[rownames(coefs4) == varstoplot[i], 1]
    se = coefs4[rownames(coefs4) == varstoplot[i], 2]
    points(x, length(varstoplot) + 1 - i + offs[4], pch = pchs[4], col = cols[4])
    lines(x = c(x-se, x+se), y = c(length(varstoplot) + 1 - i + offs[4], length(varstoplot) + 1 - i + offs[4]), col = cols[4])
  }
}
legend('bottomleft', col = cols, pch = pchs, lwd = 1, legend = c('All', 'Terestrial', 'Freshwater', 'Marine'))

[End text in hopes this helps the last figure show up when knitted]

LS0tCnRpdGxlOiAnRHJpdmVycyBvZiB2YXJpYXRpb24gaW4gdGhlIGNvbW11bml0eSByZXNwb25zZSB0byB0ZW1wZXJhdHVyZSBjaGFuZ2UgYWNyb3NzIHJlYWxtcycKc3VidGl0bGU6ICcodXNpbmcgbWl4ZWQgZWZmZWN0cyBtb2RlbHMpJwpvdXRwdXQ6IAogICAgaHRtbF9ub3RlYm9vazogZGVmYXVsdAogICAgI2h0bWxfZG9jdW1lbnQ6IGRlZmF1bHQKICAgIGdpdGh1Yl9kb2N1bWVudDogZGVmYXVsdAotLS0KCkNvbGxhYm9yYXRvcnM6IFNoYW5lIEJsb3dlcywgSm9uIENoYXNlLCBIZWxtdXQgSGlsbGVicmFuZCwgTWljaGFlbCBCdXJyb3dzLCBBbWFuZGEgQmF0ZXMsIFVsaSBCcm9zZSwgQmVub2l0IEdhdXplbnMsIExhdXJhIEFudGFvLCBSdWJlbiBSZW1lbGdhZG8sIENhcnN0ZW4gTWV5ZXIsIE15cmlhbSBIaXJ0LCBtYXliZSBvdGhlcnMKQXNzaXN0YW5jZTogS2F0aGVyaW5lIExldywgSm9zZWYgSGF1c2VyCgojIEludHJvZHVjdGlvbgotIENsaW1hdGUgY2hhbmdlIGlzIGRyaXZpbmcgYSB3aWRlc3ByZWFkIHJlb3JnYW5pemF0aW9uIG9mIGVjb2xvZ2ljYWwgY29tbXVuaXRpZXMgYXJvdW5kIHRoZSB3b3JsZCAoUGFybXNlc2FuICYgWW9oZSAyMDAzLCBQb2xvY3phbnNrYSBldCBhbC4gMjAxMyksCi0gYnV0IHRoZSBpbXBhY3RzIG9mIGNsaW1hdGUgY2hhbmdlIHZhcnkgc3Vic3RhbnRpYWxseSBmcm9tIG9uZSBsb2NhdGlvbiB0byBhbm90aGVyIGFuZCBhbW9uZyB0YXhhIChNb2xpbm9zIGV0IGFsLiAyMDE2IE5DQywgQW50YW8gZXQgYWwuIDIwMjAgTkVFKS4KLSBDb21tdW5pdHkgcmVvcmdhbml6YXRpb24gaXMgc3Vic3RhbnRpYWxseSBtb3JlIGNvbW1vbiB0aGFuIGFuIGFnZ3JlZ2F0ZSBsb3NzIG9yIGdhaW4gb2Ygc3BlY2llcyAoRG9ybmVsYXMgZXQgYWwuIDIwMTQgU2NpZW5jZSwgQmxvd2VzIGV0IGFsLiAyMDE5IFNjaWVuY2UsIEhpbGxlYnJhbmQgZXQgYWwuIDIwMTcgSiBBcHBsIEVjb2wpCi0gVGhlcmUgYXJlIG1hbnkgaHlwb3RoZXNlcyBmb3Igd2h5IHNvbWUgY29tbXVuaXRpZXMgYXJlIG1vcmUgc2Vuc2l0aXZlIHRvIHdhcm1pbmcgdGhhbiBvdGhlcnMsIGluY2x1ZGluZyBkaWZmZXJlbmNlcyBpbgogIC0gbWV0YWJvbGljIHJhdGVzIChEaWxsb24gZXQgYWwuIDIwMTAgTmF0dXJlKSwgCiAgLSB0aGVybWFsIHBoeXNpb2xvZ3kgKERldXRzY2ggZXQgYWwuIDIwMDggUE5BUywgUGluc2t5IGV0IGFsLiAyMDE5IE5hdHVyZSksIAogIC0gbWljcm9jbGltYXRlIGF2YWlsYWJpbGl0eSAoQnVycm93cyBldCBhbC4gMjAxOSBOQ0MsIFN1Z2dpdHQgZXQgYWwuIDIwMTggTkNDKSwKICAtIHNwZWNpZXMgbW9iaWxpdHkgKFBvbG9jemFuc2thIGV0IGFsLiAyMDEzIE5DQywgQnVycm93cyBldCBhbC4gMjAxMSBTY2llbmNlLCBTdW5kYXkgZXQgYWwuIDIwMTIgTkNDKQogIC0gb3IgZ2VuZXJhdGlvbiB0aW1lIChCZWF1Z3JhbmQgZXQgYWwuIDIwMDkgRFNSIElJLCBQb2xvY3phbnNrYSBldCBhbC4gMjAxMyBOQ0MpLAogIC0gY29uc3VtZXJzIHZzLiBwcm9kdWNlcnMgKFBldGNoZXkgZXQgYWwuIDE5OTkgTmF0dXJlKQogIC0gY29tbXVuaXR5IGNvbXBvc2l0aW9uIChTdHVhcnQtU21pdGggZXQgYWwuIDIwMTUgTmF0dXJlLCBCZWF1Z3JhbmQgZXQgYS4gMjAxNSBOQ0MsIFRyaXNvcyBldCBhbC4gMjAyMCBOYXR1cmUpLCAKICAtIGVjb3N5c3RlbSBwcm9kdWN0aXZpdHkgKFRob21hcyBldCBhbC4gMjAxNyBHQ0IsIEJyZXR0IDE5NzEgQW0gWm9vKSwKICAtIGV4cG9zdXJlIHRvIGh1bWFuIGltcGFjdHMgKFdoaXRlICYgS2VyciAyMDA2IEVjb2dyYXBoeSkKICAtIGFuZCBhbW9uZyByZWFsbXMgKEFudGFvIGV0IGFsLiAyMDIwIE5FRSkuCi0gU2NhbGluZyB1cCBmcm9tIG9yZ2FuaXNtYWwgZWZmZWN0cyB0byB3aG9sZSBlY29sb2dpY2FsIGNvbW11bml0aWVzIGlzIGNvbXBsZXgsIGFuZCB5ZXQgdGhlc2Ugc2NhbGVzIGFyZSBjcml0aWNhbCBmb3IgZWNvc3lzdGVtIGZ1bmN0aW9uaW5nIGFuZCBodW1hbiB3ZWxsLWJlaW5nLiAKLSBUaGVyZSBpcyBhIG5lZWQgZm9yIGEgY29tcHJlaGVuc2l2ZSB0ZXN0IHRvIHVuZGVyc3RhbmQgd2hlcmUgd2FybWluZyBpcyBkcml2aW5nIGFuZCBpcyBsaWtlbHkgdG8gZHJpdmUgdGhlIG1vc3QgZHJhbWF0aWMgY29tbXVuaXR5IHR1cm5vdmVyCgojIE1ldGhvZHMKLSBCaW9UaW1lIGRhdGFzZXQsIGdyaWRkZWQgdG8gOTYga20yIGhleGFnb25zLCBzdW1tYXJpemVkIGFzIHRlbXBvcmFsIHR1cm5vdmVyIChCbG93ZXMpCiAgLSBUZW1wb3JhbCBzbG9wZSBvZiBKYWNjYXJkIHR1cm5vdmVyIGNvbXBhcmVkIHRvIHRoZSBmaXJzdCB5ZWFyIChOT1QgaW5jbHVkaW5nIHRoZSBmaXJzdCB5ZWFyIGNvbXBhcmVkIHRvIGl0c2VsZikKICAtIFNhbWUgZm9yIEphY2NhcmQgdG90YWwKICAtIGFuZCBNb3Jpc2l0YS1Ib3JuIHR1cm5vdmVyCi0gRXhwbGFuYXRvcnkgdmFyaWFibGVzIGNvbnNpZGVyZWQgZm9yIGRpZmZlcmVuY2VzIGluIHJhdGUgb2YgdHVybm92ZXI6CiAgLSBUZW1wZXJhdHVyZSB0cmVuZCBvdmVyIHRoZSB0aW1lLWZyYW1lIG9mIGVhY2ggdGltZS1zZXJpZXMgKENSVSBUUyA0LjAzIG9uIGxhbmQgYW5kIGluIGZyZXNod2F0ZXIsIEVSU1NUIHY1IGluIHRoZSBvY2VhbikKICAtIFNlYXNvbmFsaXR5IGFzIGEgbWV0cmljIG9mIHRoZXJtYWwgc2Vuc2l0aXZpdHkgKERldXRzY2ggZXQgYWwuIDIwMDggUE5BUykuIFN0YW5kYXJkIGRldmlhdGlvbiBvZiBtb250aGx5IHRlbXBlcmF0dXJlcy4KICAtIE1pY3JvY2xpbWF0ZXMgY2FsY3VsYXRlZCBmcm9tIFdvcmxkQ2xpbSBhbmQgQmlvT3JhY2xlIChMYXVyYSBBbnRhbykKICAtIEJvZHkgbWFzcywgY29sbGF0ZWQgZnJvbSBkYXRhYmFzZXMgYW5kIGxpdGVyYXR1cmUgc2VhcmNoZXMKICAtIE1ldGFib2xpYyB0ZW1wZXJhdHVyZSwgZnJvbSBhdmVyYWdlIHRlbXBlcmF0dXJlIGlmIGVjdG90aGVybXMgKERpbGxvbiBldCBhbC4gMjAxMCBOYXR1cmUsIEFudGFvIGV0IGFsLiAyMDIwIE5hdCBFJkUpCiAgLSBNb2JpbGl0eSBjYWxjdWxhdGVkIGZyb20gYm9keSBtYXNzIGFuZCB0YXhvbm9taWMgZ3JvdXAgY2xhc3NpZmljYXRpb25zIG9mIG1vYmlsaXR5IG1vZGUgKGZseSwgcnVuLCBzd2ltLCBjcmF3bCwgc2Vzc2lsZSkuIEZseS9ydW4vc3dpbSBmb2xsb3dlZCB0aGUgYWxsb21ldHJpYyByZWxhdGlvbnNoaXAgaW4gSGlydCBldCBhbC4gMjAxNyBOYXQgRSZFLiBDcmF3bCBzZXQgYXQgMC4xIGttL2hyLCBzZXNzaWxlIHNldCB0byAwIGttL2hyLiBUaGVuIGNhbGN1bGF0ZWQgYXZlcmFnZWQgd2l0aGluIGVhY2ggYXNzZW1ibGFnZS4KICAtIEdlbmVyYXRpb24gdGltZSBjYWxjdWxhdGVkIGZyb20gYm9keSBtYXNzIGFuZCBlbmRvdGhlcm0gdnMuIGVjdG90aGVybSBjbGFzc2lmaWNhdGlvbnMsIGZvbGxvd2luZyBNY0NveSAmIEdpbGxvb2x5IDIwMDggRUxFLiBBdmVyYWdlZCBhY3Jvc3Mgc3BlY2llcyB3aXRoaW4gZWFjaCBhc3NlbWJsYWdlLiAKICAtIENvbnN1bWVyIHZzLiBwcm9kdWNlciBjbGFzc2lmaWNhdGlvbiBieSBzcGVjaWVzCiAgLSBFbmRvdGhlcm0gdnMuIGVjdG90aGVybSBjbGFzc2lmaWNhdGlvbiBieSBzcGVjaWVzCiAgLSBTcGVjaWVzIHJpY2huZXNzLCBjYWxjdWxhdGVkIGFzIHRoZSBudW1iZXIgb2Ygc3BlY2llcyBpbiB0aGUgYXNzZW1ibGFnZQogIC0gTmV0IHByaW1hcnkgcHJvZHVjdGl2aXR5IChOUFApIGZyb20gdGhlIG1lcmdlZCBsYW5kL29jZWFuIHByb2R1Y3QgcHJvZHVjZWQgYnkgdGhlIFtPY2VhbiBQcm9kdWN0aXZpdHldKGh0dHA6Ly93d3cuc2NpZW5jZS5vcmVnb25zdGF0ZS5lZHUvb2NlYW4ucHJvZHVjdGl2aXR5LykgZ3JvdXAgYXQgT3JlZ29uIFN0YXRlIHVzaW5nIG1ldGhvZHMgZnJvbSBaaGFvIGV0IGFsLiAyMDA1IGFuZCBCZWhyZW5mZWxkICYgRmFsa293c2tpIDE5OTcuIAogIC0gSHVtYW4gaW1wYWN0IGNhbGN1bGF0ZWQgZnJvbSBCb3dsZXIgZXQgYWwuIDIwMjAgKGFsc28gdHJ5IGRhdGEgZnJvbSBWZW50ZXIgZXQgYWwuIDIwMTYgYW5kIEhhbHBlcm4gZXQgYWwuIDIwMDgpCiAgLSBUaGVybWFsIGJpYXMgY2FsY3VsYXRlZCBmcm9tIFNwZWNpZXMgVGVtcGVyYXR1cmUgSW5kaWNlcyAoTWlrZSBCdXJyb3dzKQogIC0gVmVnZXRhdGlvbiBjb3ZlciBpbmRleCwgY2FsY3VsYXRlZCBmcm9tICV0cmVlIGNvdmVyIGFuZCAlbm9uLXRyZWUgdmVnIGNvdmVyIChsYXR0ZXIgY291bnRlZCBhcyAxLzIpLCBmcm9tIHZlZ2V0YXRpb24gY29udGludW91cyBmaWVsZHMgKFJ1YmVuIFJlbWVsZ2FkbykKLSBEaWZmZXJlbmNlcyBpbiB0ZW1wb3JhbCB0dXJub3ZlciAocmVzcG9uc2UgdmFyaWFibGUpIG1vZGVsZWQgd2l0aCBhIGxpbmVhciBtaXhlZCBlZmZlY3RzIG1vZGVsIChubG1lIHBhY2thZ2UsIGxtZSgpIGZ1bmN0aW9uKS4gU2VlIGJlbG93IGZvciBkZXRhaWxzLgoKYGBge3Igc2V0dXB9CmxpYnJhcnkoZGF0YS50YWJsZSkgIyBmb3IgaGFuZGxpbmcgbGFyZ2UgZGF0YXNldHMKbGlicmFyeShnZ3Bsb3QyKSAjIGZvciBzb21lIHBsb3R0aW5nCmxpYnJhcnkobmxtZSkgIyBmb3IgTUUgbW9kZWxzCmxpYnJhcnkobWFwcykgIyBmb3IgbWFwCmxpYnJhcnkoZ3JpZEV4dHJhKSAjIHRvIGNvbWJpbmUgZ2dwbG90cyB0b2dldGhlcgpsaWJyYXJ5KGdyaWQpICMgdG8gY29tYmluZSBnZ3Bsb3RzIHRvZ2V0aGVyCmxpYnJhcnkoUkNvbG9yQnJld2VyKQpsaWJyYXJ5KE1BU1MpICMgZm9yIHN0ZXBBSUMKCm9wdGlvbnMod2lkdGg9NTAwKSAjIHR1cm4gb2ZmIG1vc3QgdGV4dCB3cmFwcGluZwoKIyB0ZWxsIFJTdHVkaW8gdG8gdXNlIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkgYXMgdGhlIHJvb3QgZm9yIHRoaXMgbm90ZWJvb2suIE5lZWRlZCBzaW5jZSB3ZSBhcmUgc3RvcmluZyBjb2RlIGluIGEgc2VwYXJhdGUgZGlyZWN0b3J5Lgprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9IHJwcm9qcm9vdDo6ZmluZF9yc3R1ZGlvX3Jvb3RfZmlsZSgpKSAKYGBgCgpgYGB7ciBsb2FkIGRhdGF9CiMgVHVybm92ZXIgYW5kIGNvdmFyaWF0ZXMgYXNzZW1ibGVkIGJ5IHR1cm5vdmVyX3ZzX3RlbXBlcmF0dXJlX3ByZXAuUm1kCnRyZW5kcyA8LSBmcmVhZCgnb3V0cHV0L3R1cm5vdmVyX3dfY292YXJpYXRlcy5jc3YuZ3onKQoKIyBzZXQgcmVhbG0gb3JkZXIKdHJlbmRzWywgUkVBTE0gOj0gZmFjdG9yKFJFQUxNLCBsZXZlbHMgPSBjKCdGcmVzaHdhdGVyJywgJ01hcmluZScsICdUZXJyZXN0cmlhbCcpLCBvcmRlcmVkID0gRkFMU0UpXQoKIyBzZXQgdXAgc2lnbiBvZiB0ZW1wZXJhdHVyZSBjaGFuZ2UKdHJlbmRzWywgdHNpZ24gOj0gZmFjdG9yKHNpZ24odGVtcHRyZW5kKSldCgojIHJlYWxtIHRoYXQgY29tYmluZWQgVGVycmVzdHJpYWwgYW5kIEZyZXNod2F0ZXIsIGZvciBpbnRlcmFjdGluZyB3aXRoIGh1bWFuIGltcGFjdAp0cmVuZHNbLCBSRUFMTTIgOj0gUkVBTE1dCmxldmVscyh0cmVuZHMkUkVBTE0yKSA9IGxpc3QoVGVyckZyZXNoID0gIkZyZXNod2F0ZXIiLCBUZXJyRnJlc2ggPSAiVGVycmVzdHJpYWwiLCBNYXJpbmUgPSAiTWFyaW5lIikKCiMgZ3JvdXAgTWFyaW5lIGludmVydGVicmF0ZXMvcGxhbnRzIGluIHdpdGggQWxsCnRyZW5kc1ssIHRheGFfbW9kMiA6PSB0YXhhX21vZF0KdHJlbmRzW3RheGFfbW9kID09ICdNYXJpbmUgaW52ZXJ0ZWJyYXRlcy9wbGFudHMnLCB0YXhhX21vZDIgOj0gJ0FsbCddCgojIGNhbGN1bGF0ZSBkdXJhdGlvbgp0cmVuZHNbLCBkdXJhdGlvbiA6PSBtYXh5ckJUIC0gbWlueXJCVCArIDFdCgojIHRyaW0gdG8gZGF0YSB3aXRoID49IDMgeXJzCnRyZW5kcyA8LSB0cmVuZHNbbnlyQlQgPj0gMywgXQpgYGAKCgojIyMgTG9nLXRyYW5zZm9ybSBzb21lIHZhcmlhYmxlcywgdGhlbiBjZW50ZXIgYW5kIHNjYWxlLiAKYGBgIHtyIGNlbnRlciBhbmQgc2NhbGV9CnRyZW5kc1ssIHRlbXBhdmUuc2MgOj0gc2NhbGUodGVtcGF2ZSldCnRyZW5kc1ssIHRlbXBhdmVfbWV0YWIuc2MgOj0gc2NhbGUodGVtcGF2ZV9tZXRhYildCnRyZW5kc1ssIHNlYXMuc2MgOj0gc2NhbGUoc2VhcyldCnRyZW5kc1ssIG1pY3JvY2xpbS5zYyA6PSBzY2FsZShsb2cobWljcm9jbGltKSldCnRyZW5kc1ssIHRlbXB0cmVuZC5zYyA6PSBzY2FsZSh0ZW1wdHJlbmQsIGNlbnRlciA9IEZBTFNFKV0gIyBkbyBub3QgY2VudGVyCnRyZW5kc1ssIHRlbXB0cmVuZF9hYnMuc2MgOj0gc2NhbGUoYWJzKHRlbXB0cmVuZCksIGNlbnRlciA9IEZBTFNFKV0gIyBkbyBub3QgY2VudGVyLCBzbyB0aGF0IDAgaXMgc3RpbGwgMCB0ZW1wZXJhdHVyZSBjaGFuZ2UKdHJlbmRzWywgbWFzcy5zYyA6PSBzY2FsZShsb2cobWFzc19tZWFuX3dlaWdodCkpXQp0cmVuZHNbLCBzcGVlZC5zYyA6PSBzY2FsZShsb2coc3BlZWRfbWVhbl93ZWlnaHQrMSkpXQp0cmVuZHNbLCBsaWZlc3Bhbi5zYyA6PSBzY2FsZShsb2cobGlmZXNwYW5fbWVhbl93ZWlnaHQpKV0KdHJlbmRzWywgY29uc3VtZXJmcmFjLnNjIDo9IHNjYWxlKGNvbnNmcmFjKV0KdHJlbmRzWywgZW5kb3RoZXJtZnJhYy5zYyA6PSBzY2FsZShlbmRvZnJhYyldCnRyZW5kc1ssIG5zcHAuc2MgOj0gc2NhbGUobG9nKE5zcHApKV0KdHJlbmRzWywgdGhlcm1hbF9iaWFzLnNjIDo9IHNjYWxlKHRoZXJtYWxfYmlhcyldCnRyZW5kc1ssIG5wcC5zYyA6PSBzY2FsZShsb2cobnBwKSldCnRyZW5kc1ssIHZlZy5zYyA6PSBzY2FsZShsb2codmVnKzEpKV0KdHJlbmRzWywgZHVyYXRpb24uc2MgOj0gc2NhbGUobG9nKGR1cmF0aW9uKSldCnRyZW5kc1ssIGh1bWFuX2Jvd2xlci5zYyA6PSBzY2FsZShsb2coaHVtYW5fYm93bGVyKzEpKSwgYnkgPSBSRUFMTTJdICMgc2VwYXJhdGUgc2NhbGluZyBieSByZWFsbQp0cmVuZHNbUkVBTE0yID09ICdUZXJyRnJlc2gnLCBodW1hbl9mb290cHJpbnQuc2MgOj0gc2NhbGUobG9nKGh1bWFuX3ZlbnRlcisxKSldCnRyZW5kc1tSRUFMTTIgPT0gJ01hcmluZScsIGh1bWFuX2Zvb3RwcmludC5zYyA6PSBzY2FsZShsb2coaHVtYW5faGFscGVybikpXQpgYGAKCiMjIyBFeGFtaW5lIGhvdyBtYW55IGRhdGEgcG9pbnRzIGFyZSBhdmFpbGFibGUKSnVzdCB0dXJub3ZlcgpgYGB7ciBzYW1wbGUgc2l6ZSBhbGx9CmNhdCgnT3ZlcmFsbCAjIHRpbWUtc2VyaWVzOiAnLCBucm93KHRyZW5kcyksICdcbicpCmNhdCgnIyBzdHVkaWVzOiAnLCB0cmVuZHNbLCBsZW5ndGgodW5pcXVlKFNUVURZX0lEKSldLCAnXG4nKQpjYXQoJ0RhdGEgcG9pbnRzOiAnLCB0cmVuZHNbLCBzdW0obnlyQlQpXSwgJ1xuJykKdHJlbmRzWywgdGFibGUoUkVBTE0pXQp0cmVuZHNbLCB0YWJsZSh0YXhhX21vZCldCnRyZW5kc1ssIHRhYmxlKHRheGFfbW9kLCBSRUFMTSldCmBgYAoKV2l0aCBhbGwgY292YXJpYXRlcyAoQm93bGVyIGZvciBodW1hbikKYGBge3Igc2FtcGxlIHNpemUgZm9yIEphY2NhcmQgdHVybm92ZXJ9CiMgdGhlIGNhc2VzIHdlIGNhbiBjb21wYXJlCmFwcGx5KHRyZW5kc1ssIC4oSnR1dHJlbmRyZW0wLCBSRUFMTSwgdGVtcGF2ZS5zYywgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCB0ZW1wdHJlbmQuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCBsaWZlc3Bhbi5zYywgY29uc3VtZXJmcmFjLnNjLCBlbmRvdGhlcm1mcmFjLnNjLCBuc3BwLnNjLCB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgdmVnLnNjLCBodW1hbl9ib3dsZXIuc2MpXSwgTUFSR0lOID0gMiwgRlVOID0gZnVuY3Rpb24oeCkgc3VtKCFpcy5uYSh4KSkpCmkgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSnR1dHJlbmRyZW0wLCB0ZW1wYXZlLnNjLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIHRlbXB0cmVuZC5zYywgbWFzcy5zYywgc3BlZWQuc2MsIGxpZmVzcGFuLnNjLCBjb25zdW1lcmZyYWMuc2MsIGVuZG90aGVybWZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCB2ZWcuc2MsIGh1bWFuX2Jvd2xlci5zYyldCmNhdCgnT3ZlcmFsbCAjIHRpbWUtc2VyaWVzOiAnLCBzdW0oaSksICdcbicpCmNhdCgnIyBzdHVkaWVzOiAnLCB0cmVuZHNbaSwgbGVuZ3RoKHVuaXF1ZShTVFVEWV9JRCkpXSwgJ1xuJykKY2F0KCdEYXRhIHBvaW50czogJywgdHJlbmRzW2ksIHN1bShueXJCVCldLCAnXG4nKQp0cmVuZHNbaSwgdGFibGUoUkVBTE0pXQp0cmVuZHNbaSwgdGFibGUodGF4YV9tb2QpXQp0cmVuZHNbaSwgdGFibGUodGF4YV9tb2QsIFJFQUxNKV0KYGBgCgojIyMgQ2hvb3NlIHRoZSB2YXJpYW5jZSBzdHJ1Y3R1cmUgZm9yIG1peGVkIGVmZmVjdHMgbW9kZWxzClRyeSBjb21iaW5hdGlvbnMgb2YKCi0gdmFyaWFuY2Ugc2NhbGVkIHRvIGEgcG93ZXIgb2YgdGhlIG51bWJlciBvZiB5ZWFycyBpbiB0aGUgY29tbXVuaXR5IHRpbWUtc2VyaWVzCi0gdmFyaWFuY2Ugc2NhbGVkIHRvIGEgcG93ZXIgb2YgdGhlIGFicyB0ZW1wZXJhdHVyZSB0cmVuZAotIHJhbmRvbSBpbnRlcmNlcHQgZm9yIHRheGFfbW9kCi0gcmFuZG9tIGludGVyY2VwdCBmb3IgU1RVRFlfSUQKLSByYW5kb20gc2xvcGUgKGFicyB0ZW1wZXJhdHVyZSB0cmVuZCkgZm9yIHRheGFfbW9kCi0gcmFuZG9tIHNsb3BlIChhYnMgdGVtcGVyYXR1cmUgdHJlbmQpIGZvciBTVFVEWV9JRAotIHJhbmRvbSBpbnRlcmNlcHQgZm9yIHJhcmVmeUlEIChmb3Igb3ZlcmRpc3BlcnNpb24pCgpBbmQgY2hvb3NlIHRoZSBvbmUgd2l0aCBsb3dlc3QgQUlDIChub3QgcnVuOiB0YWtlcyBhIGxvbmcgdGltZSkKYGBge3IgY2hvb3NlIHZhcmlhbmNlIHN0cnVjdHVyZSBmb3IgSmFjYXJkIHR1cm5vdmVyLCBldmFsID0gRkFMU0V9CiMgZml0IG1vZGVscyBmb3IgdmFyaWFuY2Ugc3RydWN0dXJlCmZpeGVkIDwtIGZvcm11bGEoSnR1dHJlbmRyZW0wIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmNvbnN1bWVyZnJhYy5zYyArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnZlZy5zYyArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuX2Jvd2xlci5zYzpSRUFMTTIpCmkgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSnR1dHJlbmRyZW0wLCB0ZW1wdHJlbmRfYWJzLnNjLCBSRUFMTSwgdHNpZ24sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvY2xpbS5zYywgbWFzcy5zYywgc3BlZWQuc2MsIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgdmVnLnNjLCBodW1hbl9ib3dsZXIuc2MpXQptb2RzIDwtIHZlY3RvcignbGlzdCcsIDApCm1vZHNbWzFdXSA8LSBnbHMoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdKQptb2RzW1syXV0gPC0gZ2xzKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgd2VpZ2h0cyA9IHZhclBvd2VyKC0wLjUsIH5ueXJCVCkpCm1vZHNbWzNdXSA8LSBnbHMoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCB3ZWlnaHRzID0gdmFyUG93ZXIoMC41LCB+dGVtcHRyZW5kX2Ficy5zYykpCgptb2RzW1s0XV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gfjF8dGF4YV9tb2QyLCBjb250cm9sID0gbG1lQ29udHJvbChvcHQgPSAib3B0aW0iKSkKbW9kc1tbNV1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH4xfFNUVURZX0lELCBjb250cm9sID0gbG1lQ29udHJvbChvcHQgPSAib3B0aW0iKSkKbW9kc1tbNl1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH4xfHRheGFfbW9kMi9TVFVEWV9JRCwgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gIm9wdGltIikpCm1vZHNbWzddXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXxTVFVEWV9JRC9yYXJlZnlJRCwgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gIm9wdGltIikpCm1vZHNbWzhdXSA8LSBsbWUoZml4ZWQsIGRhdGEgPSB0cmVuZHNbaSxdLCByYW5kb20gPSB+MXx0YXhhX21vZDIvU1RVRFlfSUQvcmFyZWZ5SUQsIGNvbnRyb2wgPSBsbWVDb250cm9sKG9wdCA9ICJvcHRpbSIpKQoKbW9kc1tbOV1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IH50ZW1wdHJlbmRfYWJzLnNjIHwgdGF4YV9tb2QpCm1vZHNbWzEwXV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gbGlzdChTVFVEWV9JRCA9IH4gdGVtcHRyZW5kX2Ficy5zYywgcmFyZWZ5SUQgPSB+MSkpICMgaW5jbHVkZXMgb3ZlcmRpc3BlcnNpb24uIG5ldyBmb3JtdWxhIHNvIHRoYXQgcmFuZG9tIHNsb3BlIGlzIG9ubHkgZm9yIHN0dWR5IGxldmVsIChub3QgZW5vdWdoIGRhdGEgdG8gZXh0ZW5kIHRvIHJhcmVmeUlEKS4KCm1vZHNbWzExXV0gPC0gbG1lKGZpeGVkLCBkYXRhID0gdHJlbmRzW2ksXSwgcmFuZG9tID0gbGlzdChTVFVEWV9JRCA9IH4gdGVtcHRyZW5kX2Ficy5zYywgcmFyZWZ5SUQgPSB+MSksIHdlaWdodHMgPSB2YXJQb3dlcigtMC41LCB+bnlyQlQpKQptb2RzW1sxMl1dIDwtIGxtZShmaXhlZCwgZGF0YSA9IHRyZW5kc1tpLF0sIHJhbmRvbSA9IGxpc3QodGF4YV9tb2QyID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCBTVFVEWV9JRCA9IH4gMSwgcmFyZWZ5SUQgPSB+MSksIHdlaWdodHMgPSB2YXJQb3dlcigtMC41LCB+bnlyQlQpKQoKYWljcyA8LSBzYXBwbHkobW9kcywgQUlDKQptaW5haWNzIDwtIGFpY3MgLSBtaW4oYWljcykKbWluYWljcwp3aGljaC5taW4oYWljcykKYGBgCkNob29zZXMgdGhlIHJhbmRvbSBzbG9wZXMgKHRlbXB0cmVuZF9hYnMpICYgaW50ZXJjZXB0cyBmb3IgU1RVRFlfSUQsIG92ZXJkaXNwZXJzaW9uLCBhbmQgdmFyaWFuY2Ugc2NhbGVkIHRvIG51bWJlciBvZiB5ZWFycy4KV2UgaGF2ZW4ndCBkZWFsdCB3aXRoIHBvdGVudGlhbCB0ZXN0aW5nIG9uIHRoZSBib3VuZGFyeSBpc3N1ZXMgaGVyZSB5ZXQuCgojIFJlc3VsdHMKIyMgV2hlcmUgZG8gd2UgaGF2ZSBkYXRhPwpgYGB7ciBtYXB9CndvcmxkIDwtIG1hcF9kYXRhKCd3b3JsZCcpCmdncGxvdCh3b3JsZCwgYWVzKHggPSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSkgKwogICAgZ2VvbV9wb2x5Z29uKGZpbGwgPSAnbGlnaHRncmF5JywgY29sb3IgPSAnd2hpdGUnKSArCiAgICBnZW9tX3BvaW50KGRhdGEgPSB0cmVuZHMsIGFlcyhyYXJlZnlJRF94LCByYXJlZnlJRF95LCBncm91cCA9IFJFQUxNLCBjb2xvciA9IFJFQUxNKSwgc2l6ZSA9IDAuNSwgYWxwaGEgPSAwLjQpICArCiAgICBzY2FsZV9jb2xvcl9icmV3ZXIocGFsZXR0ZT0iU2V0MSIsIG5hbWUgPSAnUmVhbG0nKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLmtleT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTIwKSkgKwogIGxhYnMoeCA9ICdMb25naXR1ZGUgKMKwKScsIHkgPSAnTGF0aXR1ZGUgKMKwKScpCmBgYAoKTW9zdGx5IG5vcnRoZXJuIGhlbWlzcGhlcmUsIGJ1dCBzcHJlYWQgYWxsIG92ZXIuIE5vdCBzbyBtdWNoIGluIEFmcmljYSBvciBtdWNoIG9mIEFzaWEuCgoKCgpBdmVyYWdlIHJhdGVzIG9mIHR1cm5vdmVyICh3aXRob3V0IHllYXIgMSkKYGBge3IgcmF0ZXMgb2YgdHVybm92ZXIgcmVtMH0KdHJlbmRzW2Ficyh0ZW1wdHJlbmQpID49IDAuNSwgLihhdmUgPSBtZWFuKEp0dXRyZW5kcmVtMCwgbmEucm09VFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QoSnR1dHJlbmRyZW0wLCBuYS5ybT1UUlVFKS9zcXJ0KC5OKSldICMgdHVybm92ZXIgcGVyIHllYXIgZm9yIGxvY2F0aW9ucyBjaGFuZ2luZyB0ZW1wZXJhdHVyZQp0cmVuZHNbYWJzKHRlbXB0cmVuZCkgPCAwLjEsIC4oYXZlID0gbWVhbihKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QoSnR1dHJlbmRyZW0wLCBuYS5ybT1UUlVFKS9zcXJ0KC5OKSldICMgbm90IGNoYW5naW5nIHRlbXBlcmF0dXJlCnRyZW5kc1t0ZW1wdHJlbmQgPj0gMC41LCAuKGF2ZSA9IG1lYW4oSnR1dHJlbmRyZW0wLCBuYS5ybT1UUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QoSnR1dHJlbmRyZW0wLCBuYS5ybT1UUlVFKS9zcXJ0KC5OKSldICMgd2FybWluZwp0cmVuZHNbdGVtcHRyZW5kIDw9IC0wLjUsIC4oYXZlID0gbWVhbihKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNkID0gc2QoSnR1dHJlbmRyZW0wLCBuYS5ybT1UUlVFKS9zcXJ0KC5OKSldICMgY29vbGluZwoKdHJlbmRzW2Ficyh0ZW1wdHJlbmQpID49IDAuNSAmIGFicyhyYXJlZnlJRF95KSA8IDM1LCAKICAgICAgIC4oYXZlID0gbWVhbihKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgc2QgPSBzZChKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpL3NxcnQoLk4pKV0gIyB0cm9waWNzIGFuZCBzdWItdHJvcGljcwp0cmVuZHNbYWJzKHRlbXB0cmVuZCkgPj0gMC41ICYgYWJzKHJhcmVmeUlEX3kpID49IDM1ICYgYWJzKHJhcmVmeUlEX3kpIDwgNjYuNTYzMzksIAogICAgICAgLihhdmUgPSBtZWFuKEp0dXRyZW5kcmVtMCwgbmEucm09VFJVRSksIAogICAgICAgICBzZCA9IHNkKEp0dXRyZW5kcmVtMCwgbmEucm09VFJVRSkvc3FydCguTikpXSAjIHRlbXBlcmF0ZQp0cmVuZHNbYWJzKHRlbXB0cmVuZCkgPj0gMC41ICYgYWJzKHJhcmVmeUlEX3kpID49IDY2LjU2MzM5LCAKICAgICAgIC4oYXZlID0gbWVhbihKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpLCAKICAgICAgICAgc2QgPSBzZChKdHV0cmVuZHJlbTAsIG5hLnJtPVRSVUUpL3NxcnQoLk4pKV0gIyBhcmN0aWMKYGBgCgoKCiMjIFRlbXBlcmF0dXJlLW9ubHkgbW9kZWwgKEp0dXRyZW5kLCBKYmV0YXRyZW5kLCBIb3JudHJlbmQpCmBgYHtyIExNRSB0ZW1wZXJhdHVyZSBvbmx5IHJlbTB9Cmk0IDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kcmVtMCwgUkVBTE0sIHRlbXB0cmVuZCldCgpyYW5kZWYgPC0gbGlzdChTVFVEWV9JRCA9IH4gYWJzKHRlbXB0cmVuZCksIHJhcmVmeUlEID0gfjEpCnZhcmVmIDwtIHZhclBvd2VyKC0wLjUsIH5ueXJCVCkKCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZG9ubHlUdHJlbmRyZW0wLnJkcycpKXsKICBtb2Rvbmx5VHRyZW5kcmVtMCA8LSByZWFkUkRTKCd0ZW1wL21vZG9ubHlUdHJlbmRyZW0wLnJkcycpCn0gZWxzZSB7CiAgbW9kb25seVR0cmVuZHJlbTAgPC0gbG1lKEp0dXRyZW5kcmVtMCB+IGFicyh0ZW1wdHJlbmQpKlJFQUxNLAogICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTQsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kb25seVR0cmVuZHJlbTAsIGZpbGUgPSAndGVtcC9tb2Rvbmx5VHRyZW5kcmVtMC5yZHMnKQp9CgppNSA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhKYmV0YXRyZW5kcmVtMCwgUkVBTE0sIHRlbXB0cmVuZCldCmlmKGZpbGUuZXhpc3RzKCd0ZW1wL21vZG9ubHlUdHJlbmRKYmV0YXJlbTAucmRzJykpewogIG1vZG9ubHlUdHJlbmRKYmV0YXJlbTAgPC0gcmVhZFJEUygndGVtcC9tb2Rvbmx5VHRyZW5kSmJldGFyZW0wLnJkcycpCn0gZWxzZSB7CiAgbW9kb25seVR0cmVuZEpiZXRhcmVtMCA8LSBsbWUoSmJldGF0cmVuZHJlbTAgfiBhYnModGVtcHRyZW5kKSpSRUFMTSwKICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2k1LF0sIG1ldGhvZCA9ICdSRU1MJywgCiAgICAgICAgICAgICAgICAgICBjb250cm9sPWxtZUNvbnRyb2wobXNNYXhJdGVyID0gMTAwLCBtYXhJdGVyID0gMTAwKSkKICBzYXZlUkRTKG1vZG9ubHlUdHJlbmRKYmV0YXJlbTAsIGZpbGUgPSAndGVtcC9tb2Rvbmx5VHRyZW5kSmJldGFyZW0wLnJkcycpCn0KCmk2IDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEhvcm50cmVuZHJlbTAsIFJFQUxNLCB0ZW1wdHJlbmQpXQppZihmaWxlLmV4aXN0cygndGVtcC9tb2Rvbmx5VHRyZW5kSG9ybnJlbTAucmRzJykpewogIG1vZG9ubHlUdHJlbmRIb3JucmVtMCA8LSByZWFkUkRTKCd0ZW1wL21vZG9ubHlUdHJlbmRIb3JucmVtMC5yZHMnKQp9IGVsc2UgewogIG1vZG9ubHlUdHJlbmRIb3JucmVtMCA8LSBsbWUoSG9ybnRyZW5kcmVtMCB+IGFicyh0ZW1wdHJlbmQpKlJFQUxNLAogICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTYsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kb25seVR0cmVuZEhvcm5yZW0wLCBmaWxlID0gJ3RlbXAvbW9kb25seVR0cmVuZEhvcm5yZW0wLnJkcycpCn0KCnN1bW1hcnkobW9kb25seVR0cmVuZHJlbTApCnN1bW1hcnkobW9kb25seVR0cmVuZEpiZXRhcmVtMCkKc3VtbWFyeShtb2Rvbmx5VHRyZW5kSG9ybnJlbTApCgoKYGBgCgojIyMgUGxvdCB0aGUgdGVtcC1vbmx5IGNvZWZmaWNpZW50cwpgYGB7ciBtb2Rvbmx5VHRyZW5kc2ltcCBjb2Vmc30KY29sb3JzIDwtIGJyZXdlci5wYWwoMywgJ0RhcmsyJykKCiMgbWFrZSB0YWJsZSBvZiBjb2VmZmljaWVudHMKY29lZnMxIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShtb2Rvbmx5VHRyZW5kcmVtMCkkdFRhYmxlKQpjb2VmczIgPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KG1vZG9ubHlUdHJlbmRKYmV0YXJlbTApJHRUYWJsZSkKY29lZnMzIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShtb2Rvbmx5VHRyZW5kSG9ybnJlbTApJHRUYWJsZSkKY29lZnMxJG1vZCA8LSAnSnR1Jwpjb2VmczIkbW9kIDwtICdKYmV0YScKY29lZnMzJG1vZCA8LSAnSG9ybicKcm93czEgPC0gd2hpY2goZ3JlcGwoJ3RlbXB0cmVuZCcsIHJvd25hbWVzKGNvZWZzMSkpKSAjIGV4dHJhY3QgdGVtcGVyYXR1cmUgZWZmZWN0CmNvbHMgPC0gYygnVmFsdWUnLCAnU3RkLkVycm9yJywgJ21vZCcpCmFsbGNvZWZzIDwtIHJiaW5kKGNvZWZzMVtyb3dzMSwgY29sc10sIGNvZWZzMltyb3dzMSwgY29sc10sIGNvZWZzM1tyb3dzMSwgY29sc10pCmFsbGNvZWZzJFZhbHVlW2dyZXBsKCdSRUFMTU1hcmluZScsIHJvd25hbWVzKGFsbGNvZWZzKSldIDwtIAogIGFsbGNvZWZzJFZhbHVlW2dyZXBsKCdSRUFMTU1hcmluZScsIHJvd25hbWVzKGFsbGNvZWZzKSldICsgCiAgYWxsY29lZnMkVmFsdWVbIWdyZXBsKCdSRUFMTScsIHJvd25hbWVzKGFsbGNvZWZzKSldICMgYWRkIGludGVyY2VwdCB0byBtYXJpbmUgZWZmZWN0cwphbGxjb2VmcyRWYWx1ZVtncmVwbCgnUkVBTE1UZXJyZXN0cmlhbCcsIHJvd25hbWVzKGFsbGNvZWZzKSldIDwtIAogIGFsbGNvZWZzJFZhbHVlW2dyZXBsKCdSRUFMTVRlcnJlc3RyaWFsJywgcm93bmFtZXMoYWxsY29lZnMpKV0gKyAKICBhbGxjb2VmcyRWYWx1ZVshZ3JlcGwoJ1JFQUxNJywgcm93bmFtZXMoYWxsY29lZnMpKV0gIyBhZGQgaW50ZXJjZXB0IHRvIHRlcnJlc3RyaWFsIGVmZmVjdHMKCmFsbGNvZWZzJGxDSSA8LSBhbGxjb2VmcyRWYWx1ZSAtIGFsbGNvZWZzJFN0ZC5FcnJvciAjIGxvd2VyIGNvbmZpZGVuY2UgaW50ZXJ2YWwKYWxsY29lZnMkdUNJIDwtIGFsbGNvZWZzJFZhbHVlICsgYWxsY29lZnMkU3RkLkVycm9yCmFsbGNvZWZzJHkgPC0gYygzLCAyLCAxKSArIHJlcChjKDAsIC0wLjEsIC0wLjIpLCBjKDMsIDMsIDMpKSAjIHktdmFsdWVzCmFsbGNvZWZzJGNvbCA8LSBjKHJlcChjb2xvcnNbMV0sIDMpLCByZXAoY29sb3JzWzJdLCAzKSwgcmVwKGNvbG9yc1szXSwgMykpCmFsbGNvZWZzJHJlYWxtIDwtIHJlcChjKCdGcmVzaHdhdGVyJywgJ01hcmluZScsICdUZXJyZXN0cmlhbCcpLCAzKQoKcGFyKGxhcyA9IDEsIG1haSA9IGMoMC44LCAyLCAwLjEsIDAuMSkpCnBsb3QoMCwwLCBjb2wgPSAnd2hpdGUnLCB4bGltPWMoLTAuMSwgMC44NSksIHlsaW0gPSBjKDAuNSwzKSwgCiAgICAgeWF4dD0nbicsIHhsYWIgPSAnVHVybm92ZXIgcGVyIHzCsEMveXJ8JywgeWxhYiA9JycpCmF4aXMoMiwgYXQgPSAzOjEsIGxhYmVscyA9IGMoJ0ZyZXNod2F0ZXInLCAnTWFyaW5lJywgJ1RlcnJlc3RyaWFsJyksIGNleC5heGlzID0gMC43KQphYmxpbmUodiA9IDAsIGNvbCA9ICdncmV5JykKZm9yKGkgaW4gMTpucm93KGFsbGNvZWZzKSl7CiAgd2l0aChhbGxjb2Vmc1tpLCBdLCBwb2ludHMoVmFsdWUsIHksIHBjaCA9IDE2LCBjb2wgPSBjb2wpKQogIHdpdGgoYWxsY29lZnNbaSwgXSwgbGluZXMoeCA9IGMobENJLCB1Q0kpLCB5ID0gYyh5LCB5KSwgY29sID0gY29sKSkKfQpsZWdlbmQoJ2JvdHRvbXJpZ2h0JywgY29sID0gY29sb3JzLCBsd2QgPSAxLCBwY2ggPSAxNiwgCiAgICAgICBsZWdlbmQgPSBjKCdKYWNjYXJkIHR1cm5vdmVyJywgJ0phY2NhcmQgdG90YWwnLCAnSG9ybi1Nb3Jpc2l0YScsCiAgICAgICAgICAgICAgICAgICdKYWNjYXJkIHR1cm5vdmVyIHJlbTAnLCAnSmFjY2FyZCB0b3RhbCByZW0wJywgJ0hvcm4tTW9yaXNpdGEgcmVtMCcpKQoKYGBgCgojIyMgTmljZXIgcGxvdHMgb2YgdHVybm92ZXIgdnMuIHRlbXBlcmF0dXJlIGRhdGEKVmlvbGluIHBsb3RzCmBgYHtyIHR1cm5vdmVyIHZzLiB0ZW1wZXJhdHVyZSBiaWcgcGxvdCwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NC41fQojIG9uIG1hY2Jvb2s6IGZpZy53aWR0aD0zLCBmaWcuaGVpZ2h0PTIuMzc1LCBmaWcucmV0aW5hPTMsIG91dC53aWR0aD0zLCBvdXQuaGVpZ2h0PTIuMzc1CiMgb24gZXh0ZXJuYWwgbW9uaXRvcjogZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9NC41CnRyZW5kc1t0ZW1wdHJlbmQgPD0gLTAuNywgdGVtcHRyZW5kdGV4dCA6PSAnQ29vbGluZyddCnRyZW5kc1thYnModGVtcHRyZW5kKSA8PSAwLjA1LCB0ZW1wdHJlbmR0ZXh0IDo9ICdTdGFibGUnXQp0cmVuZHNbdGVtcHRyZW5kID49IDAuNywgdGVtcHRyZW5kdGV4dCA6PSAnV2FybWluZyddCgp0cmVuZHNbYWJzKHJhcmVmeUlEX3kpIDwgMzUsIGxhdHpvbmUgOj0gJ1N1YnRyb3BpY3MnXQp0cmVuZHNbYWJzKHJhcmVmeUlEX3kpID49IDM1ICYgYWJzKHJhcmVmeUlEX3gpIDwgNjYuNTYzMzksIGxhdHpvbmUgOj0gJ1RlbXBlcmF0ZSddIAp0cmVuZHNbYWJzKHJhcmVmeUlEX3kpID49IDY2LjU2MzM5LCBsYXR6b25lIDo9ICdQb2xhciddCgpwMSA8LSBnZ3Bsb3QodHJlbmRzWyFpcy5uYSh0ZW1wdHJlbmR0ZXh0KSwgXSwgYWVzKHRlbXB0cmVuZHRleHQsIEhvcm50cmVuZHJlbTApKSArCiAgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKDAuMjUsIDAuNSwgMC43NSksIGZpbGwgPSAnZ3JleScpICsKICBsYWJzKHggPSAnJywgeSA9ICdUdXJub3ZlcicsIHRhZyA9ICdBJywgdGl0bGUgPSAnUmF0ZSBvZiB0ZW1wZXJhdHVyZSBjaGFuZ2UnKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5tYWpvciA9IGVsZW1lbnRfYmxhbmsoKSwgcGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9ibGFuaygpLCBheGlzLmxpbmUgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgbGVnZW5kLmtleT1lbGVtZW50X2JsYW5rKCksCiAgICAgICAgYXhpcy50ZXh0PWVsZW1lbnRfdGV4dChzaXplPTgpLAogICAgICAgIGF4aXMudGl0bGU9ZWxlbWVudF90ZXh0KHNpemU9MTApKQoKcDIgPC0gZ2dwbG90KHRyZW5kc1thYnModGVtcHRyZW5kKSA+PSAwLjEgJiAhaXMubmEobGF0em9uZSksIF0sIGFlcyhsYXR6b25lLCBIb3JudHJlbmRyZW0wKSkgKwogIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gYygwLjI1LCAwLjUsIDAuNzUpLCBmaWxsID0gJ2dyZXknKSArIAogIGxhYnMoeCA9ICcnLCB5ID0gJycsIHRhZyA9ICdDJywgdGl0bGUgPSAnV2FybWluZyByZWdpb25zJykgKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgcGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy5saW5lID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGxlZ2VuZC5rZXk9ZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dD1lbGVtZW50X3RleHQoc2l6ZT03KSwKICAgICAgICBheGlzLnRpdGxlPWVsZW1lbnRfdGV4dChzaXplPTEwKSkKCgpncmlkLmFycmFuZ2UocDEsIHAyLCBuY29sID0gMikKYGBgCgojIyBGdWxsIG1vZGVscwpUcnkgc3RhdGljIGNvdmFyaWF0ZXMgcGx1cyBpbnRlcmFjdGlvbnMgb2YgYWJzIHRlbXBlcmF0dXJlIHRyZW5kIHdpdGggZWFjaCBjb3ZhcmlhdGU6CgotIHJlYWxtCi0gc3BlZWQKLSBtYXNzCi0gYXZlcmFnZSBtZXRhYm9saWMgdGVtcGVyYXR1cmUKLSBjb25zdW1lciBmcmFjdGlvbgotIGVudmlyb25tZW50YWwgdGVtcGVyYXR1cmUKLSBzZWFzb25hbGl0eQotIG1pY3JvY2xpbWF0ZXMKLSB0aGVybWFsIGJpYXMKLSBOUFAKLSB2ZWdldGF0aW9uCi0gZHVyYXRpb24KLSBodW1hbiBmb290cHJpbnQKCkV4Y2VwdCBmb3IgdGhlcm1hbCBiaWFzOiBpbnRlcmFjdCB3aXRoIHRlbXBlcmF0dXJlIHRyZW5kIChub3QgYWJzKQoKIyMjIEZpdCBmdWxsIG1vZGVscwojIyMjIEJvd2xlciB2cyBWZW50ZXIvSGFscGVybiBodW1hbiBpbXBhY3QKQm93bGVyIGhhcyBsb3dlciBBSUMuCmBgYHtyIExNRSBKYWNhcmQgdHVybm92ZXIgdGVtcGVyYXR1cmUgZnVsbCByZW0wfQojIHVzaW5nIEJvd2xlciBmb3IgaHVtYW4gaW1wYWN0CmkxIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYywgaHVtYW5fZm9vdHByaW50LnNjKV0KCnJhbmRlZiA8LSBsaXN0KFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKQp2YXJlZiA8LSB2YXJQb3dlcigtMC41LCB+bnlyQlQpCgptb2RUZnVsbGJvd2xlcnJlbTAgPC0gbG1lKEp0dXRyZW5kcmVtMCB+IHRlbXB0cmVuZF9hYnMuc2MqUkVBTE0gKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGVtcGF2ZV9tZXRhYi5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptYXNzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9ib3dsZXIuc2M6UkVBTE0yLAogICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTEsXSwgbWV0aG9kID0gJ1JFTUwnKQoKIyB1c2luZyBWZW50ZXIvSGFscGVybiBmb3IgaHVtYW4gaW1wYWN0Cm1vZFRmdWxsZm9vdHByaW50cmVtMCA8LSBsbWUoSnR1dHJlbmRyZW0wIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGVtcGF2ZV9tZXRhYi5zYyArIAogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptYXNzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MgKwogICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9mb290cHJpbnQuc2M6UkVBTE0yLAogICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTEsXSwgbWV0aG9kID0gJ1JFTUwnLAogICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wobWF4SXRlciA9IDEwMCwgbXNNYXhJdGVyID0gMTAwLCBuaXRlckVNID0gNTAsIG1zTWF4RXZhbCA9IDUwMCkpCgpBSUMobW9kVGZ1bGxib3dsZXJyZW0wLCBtb2RUZnVsbGZvb3RwcmludHJlbTApCgpgYGAKCiMjIyMgRnVsbCBtb2RlbHMKYGBge3IgTE1FIEphY2FyZCB0b3RhbCBhbmQgTUggbW9kZWxzIHJlbTAsIGZpZy53aWR0aD0xMCwgZmlnLmhlaWdodD04fQppMSA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhKdHV0cmVuZHJlbTAsIFJFQUxNLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXQppMiA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhKYmV0YXRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYyldCmkzIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEhvcm50cmVuZHJlbTAsIFJFQUxNLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXQoKcmFuZGVmIDwtIGxpc3QoU1RVRFlfSUQgPSB+IHRlbXB0cmVuZF9hYnMuc2MsIHJhcmVmeUlEID0gfjEpCnZhcmVmIDwtIHZhclBvd2VyKC0wLjUsIH5ueXJCVCkKCiMgZnVsbCBtb2RlbHMKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxKdHVyZW0wLnJkcycpKXsKICBtb2RUZnVsbEp0dXJlbTAgPC0gcmVhZFJEUygndGVtcC9tb2RUZnVsbEp0dXJlbTAucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEp0dXJlbTAgPC0gbG1lKEp0dXRyZW5kcmVtMCB+IHRlbXB0cmVuZF9hYnMuc2MqUkVBTE0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWljcm9jbGltLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5wcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnZlZy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqaHVtYW5fYm93bGVyLnNjOlJFQUxNMiwKICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMixdLCBtZXRob2QgPSAnUkVNTCcpCiAgc2F2ZVJEUyhtb2RUZnVsbEp0dXJlbTAsIGZpbGUgPSAndGVtcC9tb2RUZnVsbEp0dXJlbTAucmRzJykKfQoKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxKYmV0YXJlbTAucmRzJykpewogIG1vZFRmdWxsSmJldGFyZW0wIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVGZ1bGxKYmV0YXJlbTAucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEpiZXRhcmVtMCA8LSBsbWUoSmJldGF0cmVuZHJlbTAgfiB0ZW1wdHJlbmRfYWJzLnNjKlJFQUxNICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGVtcGF2ZV9tZXRhYi5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzZWFzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptYXNzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNwZWVkLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmNvbnN1bWVyZnJhYy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0aGVybWFsX2JpYXMuc2M6dHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypkdXJhdGlvbi5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuX2Jvd2xlci5zYzpSRUFMTTIsCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kVGZ1bGxKYmV0YXJlbTAsIGZpbGUgPSAndGVtcC9tb2RUZnVsbEpiZXRhcmVtMC5yZHMnKQp9CgppZihmaWxlLmV4aXN0cygndGVtcC9tb2RUZnVsbEhvcm5yZW0wLnJkcycpKXsKICBtb2RUZnVsbEhvcm5yZW0wIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVGZ1bGxIb3JucmVtMC5yZHMnKQp9IGVsc2UgewogIG1vZFRmdWxsSG9ybnJlbTAgPC0gbG1lKEhvcm50cmVuZHJlbTAgfiB0ZW1wdHJlbmRfYWJzLnNjKlJFQUxNICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzZWFzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWljcm9jbGltLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNwZWVkLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0aGVybWFsX2JpYXMuc2M6dHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5wcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdmVnLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypkdXJhdGlvbi5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqaHVtYW5fYm93bGVyLnNjOlJFQUxNMiwKICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kzLF0sIG1ldGhvZCA9ICdSRU1MJykKICBzYXZlUkRTKG1vZFRmdWxsSG9ybnJlbTAsIGZpbGUgPSAndGVtcC9tb2RUZnVsbEhvcm5yZW0wLnJkcycpCn0KCnN1bW1hcnkobW9kVGZ1bGxKdHVyZW0wKQpzdW1tYXJ5KG1vZFRmdWxsSmJldGFyZW0wKQpzdW1tYXJ5KG1vZFRmdWxsSG9ybnJlbTApCmBgYAoKIyMjIFBsb3RzIGZyb20gdGhlIGZ1bGwgbW9kZWxzCiMjIyMgUGxvdCB0aGUgY29lZmZpY2llbnRzCmBgYHtyIHBsb3QgZnVsbFRtb2RzLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OX0KCmNvZWZzMSA8LSBzdW1tYXJ5KG1vZFRmdWxsSnR1cmVtMCkkdFRhYmxlCmNvZWZzMiA8LSBzdW1tYXJ5KG1vZFRmdWxsSmJldGFyZW0wKSR0VGFibGUKY29lZnMzIDwtIHN1bW1hcnkobW9kVGZ1bGxIb3JucmVtMCkkdFRhYmxlCgp2YXJzdG9wbG90IDwtIHVuaXF1ZShjKHJvd25hbWVzKGNvZWZzMSksIHJvd25hbWVzKGNvZWZzMiksIHJvd25hbWVzKGNvZWZzMykpKQp2YXJzdG9wbG90IDwtIHZhcnN0b3Bsb3Rbd2hpY2goIWdyZXBsKCdJbnRlcmNlcHQnLCB2YXJzdG9wbG90KSB8IGdyZXBsKCc6JywgdmFyc3RvcGxvdCkpXSAjIHZhcnMgdG8gcGxvdAoKcm93czFfMSA8LSB3aGljaChyb3duYW1lcyhjb2VmczEpICVpbiUgdmFyc3RvcGxvdCkgIyByb3dzIGluIGNvZWZzCnJvd3MxXzIgPC0gd2hpY2gocm93bmFtZXMoY29lZnMyKSAlaW4lIHZhcnN0b3Bsb3QpCnJvd3MxXzMgPC0gd2hpY2gocm93bmFtZXMoY29lZnMzKSAlaW4lIHZhcnN0b3Bsb3QpCnhsaW1zIDwtIHJhbmdlKGMoY29lZnMxW3Jvd3MxXzEsMV0gLSBjb2VmczFbcm93czFfMSwyXSwgY29lZnMxW3Jvd3MxXzEsMV0gKyBjb2VmczFbcm93czFfMSwyXSwgCiAgICAgICAgICAgICAgICAgIGNvZWZzMltyb3dzMV8yLDFdIC0gY29lZnMyW3Jvd3MxXzIsMl0sIGNvZWZzMltyb3dzMV8yLDFdICsgY29lZnMyW3Jvd3MxXzIsMl0sIAogICAgICAgICAgICAgICAgICBjb2VmczNbcm93czFfMywxXSAtIGNvZWZzM1tyb3dzMV8zLDJdLCBjb2VmczNbcm93czFfMywxXSArIGNvZWZzM1tyb3dzMV8zLDJdKSkKCgpjb2xzIDwtIGJyZXdlci5wYWwoMywgJ0RhcmsyJykgIyBmb3IgSnR1LCBKYmV0YSBhbmQgSG9ybiBtb2RlbHMKcGNocyA8LSBjKDE2LCAxNiwgMTYpCm9mZnMgPC0gYygwLjEsIDAsIC0wLjEpICMgb2Zmc2V0IHZlcnRpY2FsbHkgZm9yIGVhY2ggbW9kZWwKCgpwYXIobGFzID0gMSwgbWFpID0gYygwLjUsIDQsIDAuMSwgMC4xKSkKCnBsb3QoMCwwLCBjb2wgPSAnd2hpdGUnLCB4bGltID0geGxpbXMsIHlsaW0gPSBjKDEsbGVuZ3RoKHZhcnN0b3Bsb3QpKSwgeWF4dD0nbicsIHhsYWIgPSAnJywgeWxhYiA9JycpCmF4aXMoMiwgYXQgPSBsZW5ndGgodmFyc3RvcGxvdCk6MSwgbGFiZWxzID0gdmFyc3RvcGxvdCwgY2V4LmF4aXMgPSAwLjcpCmFibGluZSh2ID0gMCwgY29sID0gJ2dyZXknLCBsdHkgPSAyKQphYmxpbmUoaCA9IDE6bGVuZ3RoKHZhcnN0b3Bsb3QpLCBjb2wgPSAnZ3JleScsIGx0eSA9IDMpCmZvcihpIGluIDE6bGVuZ3RoKHZhcnN0b3Bsb3QpKXsKICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMxKSl7CiAgICB4ID0gY29lZnMxW3Jvd25hbWVzKGNvZWZzMSkgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMxW3Jvd25hbWVzKGNvZWZzMSkgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMV0sIHBjaCA9IHBjaHNbMV0sIGNvbCA9IGNvbHNbMV0pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzFdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMV0pLCBjb2wgPSBjb2xzWzFdKQogIH0KICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMyKSl7CiAgICB4ID0gY29lZnMyW3Jvd25hbWVzKGNvZWZzMikgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMyW3Jvd25hbWVzKGNvZWZzMikgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMl0sIHBjaCA9IHBjaHNbMl0sIGNvbCA9IGNvbHNbMl0pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzJdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMl0pLCBjb2wgPSBjb2xzWzJdKQogIH0KICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMzKSl7CiAgICB4ID0gY29lZnMzW3Jvd25hbWVzKGNvZWZzMykgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMzW3Jvd25hbWVzKGNvZWZzMykgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbM10sIHBjaCA9IHBjaHNbM10sIGNvbCA9IGNvbHNbM10pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzNdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbM10pLCBjb2wgPSBjb2xzWzNdKQogIH0KfQpsZWdlbmQoJ3RvcGxlZnQnLCBjb2wgPSBjb2xzLCBwY2ggPSAxNiwgbHdkID0gMSwgbGVnZW5kID0gYygnSnR1JywgJ0piZXRhJywgJ0hvcm4nKSwgY2V4ID0gMC41KQpgYGAKCgoKCgojIyMjIFBsb3QgaW50ZXJhY3Rpb25zIChKYWNjYXJkIHR1cm5vdmVyKSB3aXRob3V0IHllYXIgMQpgYGB7ciBpbnRlcmFjdGlvbiBwbG90cyBtb2RUZnVsbHJlbTAsIGZpZy5oZWlnaHQgPSAxMywgZmlnLndpZHRoID0gOX0KCiMgc2V0IHVwIHRoZSBpbnRlcmFjdGlvbnMgdG8gcGxvdAppbnRzIDwtIGRhdGEuZnJhbWUodmFycyA9IGMoJ3RzaWduJywgJ3RlbXBhdmVfbWV0YWInLCAnc2VhcycsICdtaWNyb2NsaW0nLCAnbWFzcycsICdzcGVlZCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnN1bWVyZnJhYycsICduc3BwJywgJ3RoZXJtYWxfYmlhcycsICducHAnLCAndmVnJywgJ2R1cmF0aW9uJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHVtYW5fYm93bGVyJywgJ2h1bWFuX2Jvd2xlcicpLAogICAgICAgICAgIG1pbiA9ICAgICAgYygxLCAtMTAsIDAuMSwgMCwgICAwLCAgIDAsICAgMCwgICAwLjMsIC0xMCwgMS45LCAwLCAgIDAuNSwgMCwgICAwKSwgCiAgICAgICAgICAgbWF4ID0gICAgICBjKDIsIDMwLCAgMTYsICA2LCAgIDgsICAgMiwgICAxLCAgIDIuNiwgMTAsICAzLjcsIDEsICAgMiwgICA5LCAgIDkpLAogICAgICAgICAgIGxvZyA9ICAgICAgYyhGLCBGLCAgIEYsICAgRiwgICBULCAgIFQsICAgRiwgICBULCAgIEYsICAgVCwgICBGLCAgIFQsICAgRiwgICBGKSwKICAgICAgICAgICBsZW4gPSAgICAgIGMoMiwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwLCAxMDAsIDEwMCwgMTAwKSwKICAgICAgICAgICBkaXNjcmV0ZSA9IGMoVCwgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYsICAgRiwgICBGLCAgIEYsICAgRiksCiAgICAgICAgICAgUkVBTE0gPSBjKHJlcCgnRnJlc2h3YXRlcicsIDEzKSwgJ01hcmluZScpLAogICAgICAgICAgIFJFQUxNMiA9IGMocmVwKCdUZXJyRnJlc2gnLCAxMyksICdNYXJpbmUnKSwKICAgICAgICAgICBzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCmJhc2V0YWIgPC0gZGF0YS5mcmFtZSh0ZW1wYXZlLnNjID0gMCwgdGVtcGF2ZV9tZXRhYi5zYyA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgc2Vhcy5zYyA9IDAsIG1pY3JvY2xpbS5zYyA9IDAsIG1hc3Muc2MgPSAwLCAKICAgICAgICAgICAgICAgICAgICAgIHNwZWVkLnNjID0gMCwgbGlmZXNwYW4uc2MgPSAwLCBlbmRvdGhlcm1mcmFjLnNjID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICBuc3BwLnNjID0gMCwgdGhlcm1hbF9iaWFzLnNjID0gMCwgbnBwLnNjID0gMCwgaHVtYW5fYm93bGVyLnNjID0gMCwgdmVnLnNjID0gMCwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYyA9IDAsIGR1cmF0aW9uLnNjID0gMCwKICAgICAgICAgICAgICAgICAgICAgIG55ckJUID0gMjAsIFNUVURZX0lEID0gMTI3TCwgcmFyZWZ5SUQgPSAnMTI3XzUxNDY2OCcpCgojIG1ha2UgdGhlIGRhdGEgZnJhbWVzIGZvciBlYWNoIGludGVyYWN0aW9uIHRvIHBsb3QgICAgICAgICAgICAgICAgCmZvcihqIGluIDE6bnJvdyhpbnRzKSl7CiAgIyBzZXQgdXAgYSBncmlkIG9mIHRlbXBlcmF0dXJlIHRyZW5kcyBhbmQgdGhlIGludGVyYWN0aW5nIHZhcmlhYmxlCiAgaWYoaW50cyRsb2dbal0pIGludHZhcnMgPC0gbGlzdCh0ZW1wdHJlbmQgPSBzZXEoLTEuNSwgMS41LCBsZW5ndGgub3V0ID0gMTAwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgPSAxMF5zZXEoaW50cyRtaW5bal0sIGludHMkbWF4W2pdLCBsZW5ndGgub3V0ID0gaW50cyRsZW5bal0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciA9IGludHMkdmFyc1tqXSkKICBpZighaW50cyRsb2dbal0pIGludHZhcnMgPC0gbGlzdCh0ZW1wdHJlbmQgPSBzZXEoLTEuNSwgMS41LCBsZW5ndGgub3V0ID0gMTAwKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ID0gc2VxKGludHMkbWluW2pdLCBpbnRzJG1heFtqXSwgbGVuZ3RoLm91dCA9IGludHMkbGVuW2pdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgPSBpbnRzJHZhcnNbal0pCiAgbmFtZXMoaW50dmFycykgPC0gYygndGVtcHRyZW5kJywgaW50cyR2YXJzW2pdLCAndmFyJykKICB0aGlzZGF0IDwtIGV4cGFuZC5ncmlkKGludHZhcnMpCiAgCiAgIyBzY2FsZSB0aGUgaW50ZXJhY3RpbmcgdmFyaWFibGUKICBjZW50IDwtIGF0dHIodHJlbmRzW1twYXN0ZTAoaW50cyR2YXJbal0sICcuc2MnKV1dLCAnc2NhbGVkOmNlbnRlcicpCiAgc2NsIDwtIGF0dHIodHJlbmRzW1twYXN0ZTAoaW50cyR2YXJbal0sICcuc2MnKV1dLCAnc2NhbGVkOnNjYWxlJykKICBpZighaXMubnVsbChjZW50KSAmICFpcy5udWxsKHNjbCkpewogICAgaWYoaW50cyRsb2dbal0pIHRoaXNkYXRbW3Bhc3RlMChpbnRzJHZhcltqXSwgJy5zYycpXV0gPC0gKGxvZyh0aGlzZGF0W1tpbnRzJHZhcltqXV1dKSAtIGNlbnQpL3NjbAogICAgaWYoIWludHMkbG9nW2pdKSB0aGlzZGF0W1twYXN0ZTAoaW50cyR2YXJbal0sICcuc2MnKV1dIDwtICh0aGlzZGF0W1tpbnRzJHZhcltqXV1dIC0gY2VudCkvc2NsCiAgfQoKICAjIG1lcmdlIHdpdGggdGhlIHJlc3Qgb2YgdGhlIGNvbHVtbnMKICBpZihpbnRzJHZhcltqXSAhPSAndHNpZ24nKSBjb2xuYW1lc3RvdXNlIDwtIHNldGRpZmYoY29sbmFtZXMoYmFzZXRhYiksIHBhc3RlMChpbnRzJHZhcltqXSwgJy5zYycpKQogIGlmKGludHMkdmFyW2pdID09ICd0c2lnbicpIGNvbG5hbWVzdG91c2UgPC0gc2V0ZGlmZihjb2xuYW1lcyhiYXNldGFiKSwgaW50cyR2YXJbal0pCiAgdGhpc2RhdCA8LSBjYmluZCh0aGlzZGF0LCBiYXNldGFiWywgY29sbmFtZXN0b3VzZV0pCgogICMgYWRkIHJlYWxtCiAgdGhpc2RhdCRSRUFMTSA8LSBpbnRzJFJFQUxNW2pdCiAgdGhpc2RhdCRSRUFMTTIgPC0gaW50cyRSRUFMTTJbal0KICAKICAjIG1lcmdlIHdpdGggdGhlIHByZXZpb3VzIGl0ZXJhdGlvbnMKICBpZihqID09IDEpIG5ld2RhdCA8LSB0aGlzZGF0CiAgaWYoaiA+IDEpewogICAgY29sc3RvYWRkIDwtIHNldGRpZmYoY29sbmFtZXModGhpc2RhdCksIGNvbG5hbWVzKG5ld2RhdCkpCiAgICBmb3IodG9hZGQgaW4gY29sc3RvYWRkKXsKICAgICAgbmV3ZGF0W1t0b2FkZF1dIDwtIE5BCiAgICB9CiAgICAKICAgIGNvbHN0b2FkZDIgPC0gc2V0ZGlmZihjb2xuYW1lcyhuZXdkYXQpLCBjb2xuYW1lcyh0aGlzZGF0KSkKICAgIGZvcih0b2FkZCBpbiBjb2xzdG9hZGQyKXsKICAgICAgdGhpc2RhdFtbdG9hZGRdXSA8LSBOQQogICAgfQogICAgCiAgICBuZXdkYXQgPC0gcmJpbmQobmV3ZGF0LCB0aGlzZGF0KQogIH0gCn0KCiMgY2hhcmFjdGVyIHNvIHRoYXQgbmV3IGxldmVscyBjYW4gYmUgYWRkZWQKbmV3ZGF0JFJFQUxNIDwtIGFzLmNoYXJhY3RlcihuZXdkYXQkUkVBTE0pCm5ld2RhdCRSRUFMTTIgPC0gYXMuY2hhcmFjdGVyKG5ld2RhdCRSRUFMTTIpCgojIGFkZCBleHRyYSByb3dzIHNvIHRoYXQgYWxsIGZhY3RvciBsZXZlbHMgYXJlIHJlcHJlc2VudGVkIChmb3IgcHJlZGljdC5sbWUgdG8gd29yaykKbmV3ZGF0IDwtIHJiaW5kKG5ld2RhdFsxOjQsIF0sIG5ld2RhdCkKbmV3ZGF0JFJFQUxNWzE6NF0gPC0gYygnTWFyaW5lJywgJ01hcmluZScsICdUZXJyZXN0cmlhbCcsICdUZXJyZXN0cmlhbCcpCm5ld2RhdCRSRUFMTTJbMTo0XSA8LSBjKCdNYXJpbmUnLCAnTWFyaW5lJywgJ1RlcnJGcmVzaCcsICdUZXJyRnJlc2gnKQpuZXdkYXQkdGVtcHRyZW5kWzE6NF0gPC0gYygtMSwgMSwgLTEsIDEpCgojIHRyaW0gdG8gYXQgbGVhc3Qgc29tZSB0ZW1wZXJhdHVyZSBjaGFuZ2UgKHNvIHRoYXQgdHNpZ24gaXMgLTEgb3IgMSkKbmV3ZGF0IDwtIG5ld2RhdFtuZXdkYXQkdGVtcHRyZW5kICE9IDAsXQoKIyBzY2FsZSB0aGUgdGVtcGVyYXR1cmUgdmFycwpuZXdkYXQkdGVtcHRyZW5kLnNjIDwtIG5ld2RhdCR0ZW1wdHJlbmQvYXR0cih0cmVuZHMkdGVtcHRyZW5kLnNjLCAnc2NhbGVkOnNjYWxlJykgCm5ld2RhdCR0ZW1wdHJlbmRfYWJzIDwtIGFicyhuZXdkYXQkdGVtcHRyZW5kKQpuZXdkYXQkdGVtcHRyZW5kX2Ficy5zYyA8LSAobmV3ZGF0JHRlbXB0cmVuZF9hYnMpL2F0dHIodHJlbmRzJHRlbXB0cmVuZF9hYnMuc2MsICdzY2FsZWQ6c2NhbGUnKQpuZXdkYXQkdHNpZ24gPC0gZmFjdG9yKHNpZ24obmV3ZGF0JHRlbXB0cmVuZCkpCgojIG1ha2UgcHJlZGljdGlvbnMKbmV3ZGF0JHByZWRzIDwtIHByZWRpY3Qob2JqZWN0ID0gbW9kVGZ1bGxyZW0wLCBuZXdkYXRhID0gbmV3ZGF0LCBsZXZlbCA9IDApCgojcmVtb3ZlIHRoZSBleHRyYSByb3dzCm5ld2RhdCA8LSBuZXdkYXRbNTpucm93KG5ld2RhdCksIF0KCiMgcHJlcCB0aGUgcGxvdHMKaW50cGxvdHMgPC0gdmVjdG9yKCdsaXN0JywgbnJvdyhpbnRzKSkKZm9yKGogaW4gMTpsZW5ndGgoaW50cGxvdHMpKXsKICBzdWJzIDwtIG5ld2RhdCR2YXIgPT0gaW50cyR2YXJzW2pdICYgbmV3ZGF0JHRlbXB0cmVuZCA+IDAgIyBzZWxlY3Qgd2FybWluZyBzaWRlCiAgeHZhciA8LSAndGVtcHRyZW5kX2FicycKICB0aXRsZSA8LSBpbnRzJHZhcnNbal0KICBpZihpbnRzJHZhcnNbal0gJWluJSBjKCd0c2lnbicpKXsKICAgIHN1YnMgPC0gbmV3ZGF0JHZhciA9PSBpbnRzJHZhcnNbal0KICB9IAogIGlmKGludHMkdmFyc1tqXSAlaW4lIGMoJ3RoZXJtYWxfYmlhcycpKXsKICAgIHN1YnMgPC0gbmV3ZGF0JHZhciA9PSBpbnRzJHZhcnNbal0KICAgIHh2YXIgPC0gJ3RlbXB0cmVuZCcKICB9IAogIGlmKGludHMkdmFyc1tqXSAlaW4lIGMoJ2h1bWFuX2Jvd2xlcicpKXsKICAgIHN1YnMgPC0gbmV3ZGF0JHZhciA9PSBpbnRzJHZhcnNbal0gJiBuZXdkYXQkdGVtcHRyZW5kID4gMCAmIG5ld2RhdCRSRUFMTTIgPT0gaW50cyRSRUFMTTJbal0KICAgIHRpdGxlIDwtIHBhc3RlMCgnaHVtYW46JywgaW50cyRSRUFMTTJbal0pCiAgfSAKCiAgdGhpc3Bsb3QgPC0gZ2dwbG90KG5ld2RhdFtzdWJzLCBdLCAKICAgICAgICAgICAgICAgICAgICAgYWVzX3N0cmluZyh4ID0geHZhciwgeSA9ICdwcmVkcycsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gaW50cyR2YXJzW2pdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IGludHMkdmFyc1tqXSkpICsKICAgIGdlb21fbGluZSgpICsKICAgIGNvb3JkX2NhcnRlc2lhbih5bGltID0gYygtMC42LCAwLjYpKSArCiAgICB0aGVtZShwbG90Lm1hcmdpbiA9IHVuaXQoYygwLjUsMCwwLjUsMCksICdjbScpKSArCiAgICBsYWJzKHRpdGxlID0gdGl0bGUpCiAgaWYoaW50cyRsb2dbal0gJiAhaW50cyRkaXNjcmV0ZVtqXSl7CiAgICBpbnRwbG90c1tbal1dIDwtIHRoaXNwbG90ICsgc2NhbGVfY29sb3JfZGlzdGlsbGVyKHBhbGV0dGUgPSAiWWxHbkJ1IiwgdHJhbnMgPSAnbG9nJykKICB9CiAgaWYoIWludHMkbG9nW2pdICYgIWludHMkZGlzY3JldGVbal0pewogICAgaW50cGxvdHNbW2pdXSA8LSB0aGlzcGxvdCArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlID0gIllsR25CdSIsIHRyYW5zID0gJ2lkZW50aXR5JykKICB9CiAgaWYoaW50cyRkaXNjcmV0ZVtqXSl7CiAgICBpbnRwbG90c1tbal1dIDwtIHRoaXNwbG90ICsgc2NhbGVfY29sb3JfYnJld2VyKHBhbGV0dGUgPSAiRGFyazIiKQogIH0KfQoKI2dyaWQuYXJyYW5nZShncm9icyA9IGludHBsb3RzLCAnKycsIHRoZW1lKHBsb3QubWFyZ2luID0gdW5pdChjKDAsMCwwLDApLCAnY20nKSkpLCBuY29sPTIpCiNkby5jYWxsKCdncmlkLmFycmFuZ2UnLCBjKGludHBsb3RzLCBuY29sID0gMikpCmdyaWQuYXJyYW5nZShncm9icyA9IGludHBsb3RzLCBuY29sID0gMykKCiMgd3JpdGUgb3V0IHRoZSBpbnRlcmFjdGlvbnMKd3JpdGUuY3N2KG5ld2RhdCwgZmlsZSA9ICd0ZW1wL2ludGVyYWN0aW9ucy5jc3YnKQoKYGBgCgojIyMjIFBsb3QgcmVzaWR1YWxzIGFnYWluc3QgZWFjaCBwcmVkaWN0b3IgKEphY2NhcmQgdHVybm92ZXIpCmBgYHtyIHJlc2lkcyBtb2RUZnVsbDEsIGZpZy5oZWlnaHQgPSAxMCwgZmlnLndpZHRoPTEwfQpyZXNpZHMgPC0gcmVzaWQobW9kVGZ1bGwxKQpwcmVkcyA8LSBnZXREYXRhKG1vZFRmdWxsMSkKY29sID0gJyMwMDAwMDAzMycKY2V4ID0gMC41CnBhcihtZnJvdyA9IGMoNSw0KSkKYm94cGxvdChyZXNpZHMgfiBwcmVkcyRSRUFMTSwgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkdGVtcHRyZW5kX2Ficy5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyR0c2lnbiwgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyR0ZW1wYXZlLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJHRlbXBhdmVfbWV0YWIuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkc2Vhcy5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRtaWNyb2NsaW0uc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkbWFzcy5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRzcGVlZC5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRsaWZlc3Bhbi5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRjb25zdW1lcmZyYWMuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkZW5kb3RoZXJtZnJhYy5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRuc3BwLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJHRoZXJtYWxfYmlhcy5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKcGxvdChwcmVkcyRucHAuc2MsIHJlc2lkcywgY2V4ID0gY2V4LCBjb2wgPSBjb2wpCnBsb3QocHJlZHMkdmVnLnNjLCByZXNpZHMsIGNleCA9IGNleCwgY29sID0gY29sKQpwbG90KHByZWRzJGh1bWFuX2Jvd2xlci5zYywgcmVzaWRzLCBjZXggPSBjZXgsIGNvbCA9IGNvbCkKYGBgCgojIyMgUmVtb3ZlIGVhY2ggdGVybSBmcm9tIHRoZSBmdWxsIG1vZGVsCmBgYHtyIHRlcm0gZGVsZXRpb24gZnJvbSBtb2RUZnVsbH0KQUlDbmFzIDwtIGZ1bmN0aW9uKHgpewogIGlmKGNsYXNzKHgpID09ICdOVUxMJyl7CiAgICByZXR1cm4oTkEpCiAgfSBlbHNlIHsKICAgIHJldHVybihBSUMoeCkpCiAgfQp9CgppZihmaWxlLmV4aXN0cygnb3V0cHV0L2FpY3NfZnJvbV9mdWxsLmNzdicpKXsKICBhaWNzZnJvbWZ1bGwgPC0gcmVhZC5jc3YoJ291dHB1dC9haWNzX2Zyb21fZnVsbC5jc3YnKQogIAogIGlmKCdkQUlDX0p0dScgJWluJSBjb2xuYW1lcyhhaWNzZnJvbWZ1bGwpKXsKICAgIHJ1bkp0dSA8LSBGQUxTRQogIH0gZWxzZSB7CiAgICBydW5KdHUgPC0gVFJVRQogIH0KICAKICBpZignZEFJQ19KYmV0YScgJWluJSBjb2xuYW1lcyhhaWNzZnJvbWZ1bGwpKXsKICAgIHJ1bkpiZXRhIDwtIEZBTFNFCiAgfSBlbHNlIHsKICAgIHJ1bkpiZXRhIDwtIFRSVUUKICB9CiAgCiAgaWYoJ2RBSUNfSG9ybicgJWluJSBjb2xuYW1lcyhhaWNzZnJvbWZ1bGwpKXsKICAgIHJ1bkhvcm4gPC0gRkFMU0UKICB9IGVsc2UgewogICAgcnVuSG9ybiA8LSBUUlVFCiAgfQogIAp9IGVsc2UgewogIHJ1bkp0dSA8LSBUUlVFCiAgcnVuSmJldGEgPC0gVFJVRQogIHJ1bkhvcm4gPC0gVFJVRQp9CgpyYW5kZWYgPC0gbGlzdChTVFVEWV9JRCA9IH4gdGVtcHRyZW5kX2Ficy5zYywgcmFyZWZ5SUQgPSB+MSkKdmFyZWYgPC0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKQoKdGVybXMgPC0gYygndGVtcHRyZW5kX2Ficy5zYypSRUFMTScsIAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKnRzaWduJywKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjJywKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYypzZWFzLnNjJywKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MnLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MnLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKnNwZWVkLnNjJywgCiAgICAgICAgICAgJ3RlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjJywKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjJywKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYyp0aGVybWFsX2JpYXMuc2M6dHNpZ24nLAogICAgICAgICAgICd0ZW1wdHJlbmRfYWJzLnNjKm5wcC5zYycsCiAgICAgICAgICAgJ3RlbXB0cmVuZF9hYnMuc2MqdmVnLnNjJywKICAgICAgICAgICAndGVtcHRyZW5kX2Ficy5zYypkdXJhdGlvbi5zYycsCiAgICAgICAgICAgJ3RlbXB0cmVuZF9hYnMuc2MqaHVtYW5fYm93bGVyLnNjOlJFQUxNMicpCgoKaWYocnVuSnR1KXsKICBpIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjLCBtYXNzLnNjLCBzcGVlZC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYyldCiAgCiAgbW9kVGRyb3BzIDwtIHZlY3RvcignbGlzdCcsIGxlbmd0aCh0ZXJtcykrMikKICBuYW1lcyhtb2RUZHJvcHMpIDwtIGMoJ2Z1bGwnLCAnLXRlbXB0cmVuZF9hYnMuc2MnLCBwYXN0ZTAoJy0nLCB0ZXJtcykpCiAgCiAgIyBmaXQgZnVsbCBtb2RlbCB3aXRoIE1MIGZvciBtb2RlbCBjb21wYXJpc29uCiAgbW9kVGRyb3BzW1sxXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKdHV0cmVuZHJlbTAgfiAnLCBwYXN0ZSh0ZXJtcywgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaSxdLCBtZXRob2QgPSAnTUwnKQogIAogICMgdy9vdXQgdGVtcHRyZW5kCiAgbW9kVGRyb3BzW1syXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKdHV0cmVuZHJlbTAgfiAnLCBwYXN0ZShnc3ViKCd0ZW1wdHJlbmRfYWJzLnNjXFwqJywgJycsIHRlcm1zKSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gbGlzdChTVFVEWV9JRCA9IH4gMSwgcmFyZWZ5SUQgPSB+MSksIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpLF0sIG1ldGhvZCA9ICdNTCcpCiAgCiAgZm9yKGogaW4gMTpsZW5ndGgodGVybXMpKXsKICAgIHByaW50KGopCiAgICB0cnlDYXRjaCh7CiAgICAgIG1vZFRkcm9wc1tbaisyXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKdHV0cmVuZHJlbTAgfiAnLCBwYXN0ZSh0ZXJtc1stal0sIGNvbGxhcHNlID0gJyArICcpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2ksXSwgbWV0aG9kID0gJ01MJykKICAgICAgCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpewogICAgICBwcmludCgnZ29pbmcgdG8gb3B0aW0gKEp0dSknKQogICAgICB0cnlDYXRjaCh7CiAgICAgICAgbW9kVGRyb3BzW1tqKzJdXSA8LSBsbWUoZm9ybXVsYShwYXN0ZTAoJ0p0dXRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zWy1qXSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpLF0sIG1ldGhvZCA9ICdNTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gJ29wdGltJykpCiAgICAgICAgCiAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSl7CiAgICAgICAgcHJpbnQoJ2dvaW5nIHRvIG1vcmUgaXRlcnMgKEp0dSknKSAKICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICBtb2RUZHJvcHNbW2orMl1dIDwtIGxtZShmb3JtdWxhKHBhc3RlMCgnSnR1dHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXNbLWpdLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaSxdLCBtZXRob2QgPSAnTUwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wobWF4SXRlciA9IDEwMCwgbXNNYXhJdGVyID0gMTAwLCBuaXRlckVNID0gNTAsIG1zTWF4RXZhbCA9IDUwMCkpCiAgICAgICAgICAKICAgICAgICB9LCBlcnJvcj0gZnVuY3Rpb24oZSl7CiAgICAgICAgICBwcmludCgnZ2l2aW5nIHVwIG9uIHRoaXMgb25lJykKICAgICAgICAgIG1vZFRkcm9wc1tbaisyXV0gPC0gTkEKICAgICAgICB9KQogICAgICB9KQogICAgfSkKICB9CiAgCiAgYWljc0p0dSA8LSBzYXBwbHkobW9kVGRyb3BzLCBBSUNuYXMpCn0KCgppZihydW5KYmV0YSl7CiAgaSA8LSB0cmVuZHNbLCBjb21wbGV0ZS5jYXNlcyhKYmV0YXRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjLCBtYXNzLnNjLCBzcGVlZC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYyldCiAgCiAgbW9kVEpiZXRhZHJvcHMgPC0gdmVjdG9yKCdsaXN0JywgbGVuZ3RoKHRlcm1zKSsyKQogIG5hbWVzKG1vZFRKYmV0YWRyb3BzKSA8LSBjKCdmdWxsJywgJy10ZW1wdHJlbmRfYWJzLnNjJywgcGFzdGUwKCctJywgdGVybXMpKQogIAogICMgZml0IGZ1bGwgbW9kZWwgd2l0aCBNTCBmb3IgbW9kZWwgY29tcGFyaXNvbgogIG1vZFRKYmV0YWRyb3BzW1sxXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKYmV0YXRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2ksXSwgbWV0aG9kID0gJ01MJykKICAKICAjIHcvb3V0IHRlbXB0cmVuZAogIG1vZFRKYmV0YWRyb3BzW1syXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKYmV0YXRyZW5kcmVtMCB+ICcsIHBhc3RlKGdzdWIoJ3RlbXB0cmVuZF9hYnMuc2NcXConLCAnJywgdGVybXMpLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IGxpc3QoU1RVRFlfSUQgPSB+IDEsIHJhcmVmeUlEID0gfjEpLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaSxdLCBtZXRob2QgPSAnTUwnKQogIAogIGZvcihqIGluIDE6bGVuZ3RoKHRlcm1zKSl7CiAgICBwcmludChqKQogICAgdHJ5Q2F0Y2goewogICAgICBtb2RUSmJldGFkcm9wc1tbaisyXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKYmV0YXRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zWy1qXSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpLF0sIG1ldGhvZCA9ICdNTCcpCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpewogICAgICBwcmludCgnZ29pbmcgdG8gb3B0aW0gKEpiZXRhKScpCiAgICAgIHRyeUNhdGNoKHsKICAgICAgICBtb2RUSmJldGFkcm9wc1tbaisyXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKYmV0YXRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zWy1qXSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2ksXSwgbWV0aG9kID0gJ01MJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgPSBsbWVDb250cm9sKG9wdCA9ICdvcHRpbScpKQogICAgICAgIAogICAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpewogICAgICAgIHByaW50KCdnb2luZyB0byBtb3JlIGl0ZXJzIChKYmV0YSknKSAKICAgICAgICB0cnlDYXRjaCh7CiAgICAgICAgICBtb2RUSmJldGFkcm9wc1tbaisyXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdKYmV0YXRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zWy1qXSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaSxdLCBtZXRob2QgPSAnTUwnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sID0gbG1lQ29udHJvbChtYXhJdGVyID0gMTAwLCBtc01heEl0ZXIgPSAxMDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaXRlckVNID0gNTAsIG1zTWF4RXZhbCA9IDUwMCkpCiAgICAgICAgfSwgZXJyb3I9IGZ1bmN0aW9uKGUpewogICAgICAgICAgcHJpbnQoJ2dpdmluZyB1cCBvbiB0aGlzIG9uZSAoSmJldGEpJykKICAgICAgICAgIG1vZFRKYmV0YWRyb3BzW1tqKzJdXSA8LSBOQQogICAgICAgIH0pCiAgICAgIH0KICAgICAgKQogICAgfQogICAgKQogIH0KICBhaWNzSmJldGEgPC0gc2FwcGx5KG1vZFRKYmV0YWRyb3BzLCBBSUNuYXMpCn0KCmlmKHJ1bkhvcm4pewogIGkyIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEhvcm50cmVuZHJlbTAsIFJFQUxNLCB0ZW1wYXZlX21ldGFiLnNjLCBzZWFzLnNjLCBtaWNyb2NsaW0uc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MsIG1hc3Muc2MsIHNwZWVkLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lcmZyYWMuc2MsIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXQogIAogIG1vZFRIb3JuZHJvcHMgPC0gdmVjdG9yKCdsaXN0JywgbGVuZ3RoKHRlcm1zKSsyKQogIG5hbWVzKG1vZFRIb3JuZHJvcHMpIDwtIGMoJ2Z1bGwnLCAnLXRlbXB0cmVuZF9hYnMuc2MnLCBwYXN0ZTAoJy0nLCB0ZXJtcykpCiAgbW9kVEhvcm5kcm9wc1tbMV1dIDwtIGxtZShmb3JtdWxhKHBhc3RlMCgnSG9ybnRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ01MJykKICBtb2RUSG9ybmRyb3BzW1syXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdIb3JudHJlbmRyZW0wIH4gJywgcGFzdGUoZ3N1YigndGVtcHRyZW5kX2Ficy5zY1xcKicsICcnLCB0ZXJtcyksIGNvbGxhcHNlID0gJyArICcpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSBsaXN0KFNUVURZX0lEID0gfiAxLCByYXJlZnlJRCA9IH4xKSwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kyLF0sIG1ldGhvZCA9ICdNTCcpCiAgCiAgZm9yKGogaW4gMTpsZW5ndGgodGVybXMpKXsKICAgIHByaW50KGopCiAgICB0cnlDYXRjaCh7CiAgICAgIG1vZFRIb3JuZHJvcHNbW2orMl1dIDwtIGxtZShmb3JtdWxhKHBhc3RlMCgnSG9ybnRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zWy1qXSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kyLF0sIG1ldGhvZCA9ICdNTCcpCiAgICB9LCBlcnJvciA9IGZ1bmN0aW9uKGUpewogICAgICBwcmludCgnZ29pbmcgdG8gb3B0aW0gKEhvcm4pJykKICAgICAgdHJ5Q2F0Y2goewogICAgICAgIG1vZFRIb3JuZHJvcHNbW2orMl1dIDwtIGxtZShmb3JtdWxhKHBhc3RlMCgnSG9ybnRyZW5kcmVtMCB+ICcsIHBhc3RlKHRlcm1zWy1qXSwgY29sbGFwc2UgPSAnICsgJykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ01MJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wob3B0ID0gJ29wdGltJykpCiAgICAgICAgCiAgICAgIH0sIGVycm9yID0gZnVuY3Rpb24oZSl7CiAgICAgICAgcHJpbnQoJ2dvaW5nIHRvIG1vcmUgaXRlcnMgKEhvcm4pJykgCiAgICAgICAgdHJ5Q2F0Y2goewogICAgICAgICAgbW9kVEhvcm5kcm9wc1tbaisyXV0gPC0gbG1lKGZvcm11bGEocGFzdGUwKCdIb3JudHJlbmRyZW0wIH4gJywgcGFzdGUodGVybXNbLWpdLCBjb2xsYXBzZSA9ICcgKyAnKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kyLF0sIG1ldGhvZCA9ICdNTCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wobWF4SXRlciA9IDEwMCwgbXNNYXhJdGVyID0gMTAwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuaXRlckVNID0gNTAsIG1zTWF4RXZhbCA9IDUwMCkpCiAgICAgICAgICAKICAgICAgICB9LCBlcnJvcj0gZnVuY3Rpb24oZSl7CiAgICAgICAgICBwcmludCgnZ2l2aW5nIHVwIG9uIHRoaXMgb25lIChIb3JuKScpCiAgICAgICAgICBtb2RUSG9ybmRyb3BzW1tqKzJdXSA8LSBOQQogICAgICAgIH0pCiAgICAgIH0pCiAgICB9KQogIH0KICBhaWNzSG9ybiA8LSBzYXBwbHkobW9kVEhvcm5kcm9wcywgQUlDbmFzKQp9CgojIGlmIHRoZXJlIHdhcyBhbnl0aGluZyBuZXcKaWYocnVuSnR1IHwgcnVuSmJldGEgfCBydW5Ib3JuKXsKICBpZighZXhpc3RzKCdhaWNzZnJvbWZ1bGwnKSl7CiAgICBhaWNzZnJvbWZ1bGwgPC0gZGF0YS5mcmFtZShtb2QgPSBuYW1lcyhhaWNzSnR1KSkKICB9CiAgCiAgIyBzdWJ0cmFjdCBmdWxsIGZyb20gZWFjaCBtb2RlbCBBSUMuIE5lZ2F0aXZlIG1lYW5zIHRlcm0gcmVtb3ZhbCBpcyBzdXBwb3J0ZWQuIFBvc2l0aXZlIG1lYW5zIGZ1bGwgaXMgdGhlIGJldHRlciBtb2RlbC4KICBpZihydW5KdHUpewogICAgYWljc2Zyb21mdWxsJGRBSUNfSnR1IDwtIGFpY3NKdHUgLSBhaWNzSnR1WzFdCiAgfQogIGlmKHJ1bkpiZXRhKXsKICAgIGFpY3Nmcm9tZnVsbCRkQUlDX0piZXRhIDwtIGFpY3NKYmV0YSAtIGFpY3NKYmV0YVsxXQogIH0KICBpZihydW5Ib3JuKXsKICAgIGFpY3Nmcm9tZnVsbCRkQUlDX0hvcm4gPC0gYWljc0hvcm4gLSBhaWNzSG9yblsxXQogIH0KICAKICAjIHdyaXRlIG91dAogIHdyaXRlLmNzdihhaWNzZnJvbWZ1bGwsIGZpbGUgPSAnb3V0cHV0L2FpY3NfZnJvbV9mdWxsLmNzdicsIHJvdy5uYW1lcyA9IEZBTFNFKQp9CgphaWNzZnJvbWZ1bGwKYGBgCgojIyMjIFBsb3QgZGVsdGFBSUNzIGZvciBhbGwgMyBtb2RlbHMKYGBge3IgcGxvdCBkQUlDc30KIyB0cmFuc2Zvcm0gZm9yIGEgcGxvdAphaWNzZnJvbWZ1bGxsb25nIDwtIHJlc2hhcGUoYWljc2Zyb21mdWxsLCBkaXJlY3Rpb24gPSAnbG9uZycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJ5aW5nID0gYygnZEFJQ19KdHUnLCAnZEFJQ19KYmV0YScsICdkQUlDX0hvcm4nKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYubmFtZXMgPSAnZEFJQycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZHZhciA9ICdtb2QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXZhciA9ICd0eXBlJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzID0gYygnSnR1JywgJ0piZXRhJywgJ0hvcm4nKSkKCnRyYW5zID0gZnVuY3Rpb24oeCkgc2lnbih4KSpzcXJ0KGFicyh4KSkKYWljc2Zyb21mdWxsbG9uZyRkQUlDX3RyIDwtIHRyYW5zKGFpY3Nmcm9tZnVsbGxvbmckZEFJQykKCiMgcGxvdAp4bGltcyA8LSByYW5nZShhaWNzZnJvbWZ1bGxsb25nJGRBSUNfdHIsIG5hLnJtID0gVFJVRSkKeHRpY2tzIDwtIGMoLTEwLCAwLCAxMCwgMTAwLCAxMDAwLCAxMDAwMCkKcGFyKG1haSA9IGMoMC41LCAzLCAwLjEsIDAuMSkpCndpdGgoYWljc2Zyb21mdWxsbG9uZ1thaWNzZnJvbWZ1bGxsb25nJHR5cGUgPT0gJ0p0dScsXSwgcGxvdChkQUlDX3RyLCBucm93KGFpY3Nmcm9tZnVsbCk6MSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sID0gJ2xpZ2h0IGdyZXknLCB4bGltID0geGxpbXMsIHlheHQgPSAnbicsIHlsYWIgPSAnJywgeGF4dCA9ICduJykpCndpdGgoYWljc2Zyb21mdWxsbG9uZ1thaWNzZnJvbWZ1bGxsb25nJHR5cGUgPT0gJ0piZXRhJyxdLCBwb2ludHMoZEFJQ190ciwgbnJvdyhhaWNzZnJvbWZ1bGwpOjEgLSAwLjEsIGNvbCA9ICdkYXJrIGdyZXknKSkKd2l0aChhaWNzZnJvbWZ1bGxsb25nW2FpY3Nmcm9tZnVsbGxvbmckdHlwZSA9PSAnSG9ybicsXSwgcG9pbnRzKGRBSUNfdHIsIG5yb3coYWljc2Zyb21mdWxsKToxIC0gMC4yLCBjb2wgPSAnYmxhY2snKSkKYXhpcygyLCBhdCA9IG5yb3coYWljc2Zyb21mdWxsKToxLCBsYWJlbHMgPSBhaWNzZnJvbWZ1bGwkbW9kLCBsYXMgPSAxLCBjZXguYXhpcyA9IDAuNykKYXhpcygxLCBhdCA9IHRyYW5zKHh0aWNrcyksIGxhYmVscyA9IHh0aWNrcywgY2V4LmF4aXMgPSAwLjUpCmFibGluZSh2ID0gMCwgbHR5ID0yLCBjb2wgPSAnZ3JleScpCmBgYAoKTGlnaHQgZ3JleSBpcyBmb3IgSmFjY2FyZCB0dXJub3ZlciwgZGFyayBncmV5IGlzIGZvciBKYWNjYXJkIHRvdGFsLCBibGFjayBpcyBmb3IgTW9yaXNpdGEtSG9ybi4KQ2xlYXIgdGhhdCByZW1vdmluZyB0ZW1wZXJhdHVyZSB0cmVuZCBtYWtlcyB0aGUgbW9kZWwgcXVpdGUgYSBiaXQgd29yc2UgYW5kIGhhcyB0aGUgYmlnZ2VzdCBlZmZlY3QuCgoKCiMjIFNpbXBsaWZ5IHRoZSBmdWxsIG1vZGVscwpUaGlzIHRha2VzIGEgY291cGxlIGRheXMgb24gYSBsYXB0b3AgdG8gcnVuLgpgYGB7ciBzaW1wbGlmeSB0aGUgZnVsbCBtb2RlbHN9CmkxIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEp0dXRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYyldCmkyIDwtIHRyZW5kc1ssIGNvbXBsZXRlLmNhc2VzKEpiZXRhdHJlbmRyZW0wLCBSRUFMTSwgdGVtcGF2ZV9tZXRhYi5zYywgc2Vhcy5zYywgbWljcm9jbGltLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjLCBtYXNzLnNjLCBzcGVlZC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJmcmFjLnNjLCBuc3BwLnNjLCB0aGVybWFsX2JpYXMuc2MsIG5wcC5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVnLnNjLCBkdXJhdGlvbi5zYywgaHVtYW5fYm93bGVyLnNjKV0KaTMgPC0gdHJlbmRzWywgY29tcGxldGUuY2FzZXMoSG9ybnRyZW5kcmVtMCwgUkVBTE0sIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYyldCgpyYW5kZWYgPC0gbGlzdChTVFVEWV9JRCA9IH4gdGVtcHRyZW5kX2Ficy5zYywgcmFyZWZ5SUQgPSB+MSkKdmFyZWYgPC0gdmFyUG93ZXIoLTAuNSwgfm55ckJUKQoKIyBzaW1wbGlmeSB0aGUgZnVsbCBtb2RlbHMKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVHNpbXBKdHVyZW0wLnJkcycpKXsKICBtb2RUc2ltcEp0dXJlbTAgPC0gcmVhZFJEUygndGVtcC9tb2RUc2ltcEp0dXJlbTAucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEp0dXJlbTBNTCA8LSBsbWUoSnR1dHJlbmRyZW0wIH4gdGVtcHRyZW5kX2Ficy5zYypSRUFMTSArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdmVnLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9ib3dsZXIuc2M6UkVBTE0yLAogICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kxLF0sIG1ldGhvZCA9ICdNTCcsCiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wobWF4SXRlciA9IDEwMCwgbXNNYXhJdGVyID0gMTAwLCBuaXRlckVNID0gNTAsIG1zTWF4RXZhbCA9IDUwMCkpCiAgbW9kVHNpbXBKdHVyZW0wIDwtIHN0ZXBBSUMobW9kVGZ1bGxKdHVyZW0wTUwsIGRpcmVjdGlvbiA9ICdiYWNrd2FyZCcpCiAgc2F2ZVJEUyhtb2RUc2ltcEp0dXJlbTAsIGZpbGUgPSAndGVtcC9tb2RUc2ltcEp0dXJlbTAucmRzJykKfQoKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVHNpbXBKYmV0YXJlbTAucmRzJykpewogIG1vZFRzaW1wSmJldGFyZW0wIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVHNpbXBKYmV0YXJlbTAucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEpiZXRhcmVtME1MIDwtIGxtZShKYmV0YXRyZW5kcmVtMCB+IHRlbXB0cmVuZF9hYnMuc2MqUkVBTE0gKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0ZW1wYXZlX21ldGFiLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNlYXMuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWljcm9jbGltLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1hc3Muc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc3BlZWQuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnNwcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRoZXJtYWxfYmlhcy5zYzp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5wcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnZlZy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmR1cmF0aW9uLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqaHVtYW5fYm93bGVyLnNjOlJFQUxNMiwKICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMixdLCBtZXRob2QgPSAnTUwnKQogIG1vZFRzaW1wSmJldGFyZW0wIDwtIHN0ZXBBSUMobW9kVGZ1bGxKYmV0YXJlbTBNTCwgZGlyZWN0aW9uID0gJ2JhY2t3YXJkJykKICBzYXZlUkRTKG1vZFRzaW1wSmJldGFyZW0wLCBmaWxlID0gJ3RlbXAvbW9kVHNpbXBKYmV0YXJlbTAucmRzJykKfQoKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVHNpbXBIb3JucmVtMC5yZHMnKSl7CiAgbW9kVHNpbXBIb3JucmVtMCA8LSByZWFkUkRTKCd0ZW1wL21vZFRzaW1wSG9ybnJlbTAucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEhvcm5yZW0wTUwgPC0gbG1lKEhvcm50cmVuZHJlbTAgfiB0ZW1wdHJlbmRfYWJzLnNjKlJFQUxNICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzZWFzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWljcm9jbGltLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNwZWVkLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqY29uc3VtZXJmcmFjLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0aGVybWFsX2JpYXMuc2M6dHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5wcC5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdmVnLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypkdXJhdGlvbi5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqaHVtYW5fYm93bGVyLnNjOlJFQUxNMiwKICAgICAgICAgICAgICAgICAgICAgIHJhbmRvbSA9IHJhbmRlZiwgd2VpZ2h0cyA9IHZhcmVmLCBkYXRhID0gdHJlbmRzW2kzLF0sIG1ldGhvZCA9ICdNTCcpCiAgbW9kVHNpbXBIb3JucmVtMCA8LSBzdGVwQUlDKG1vZFRmdWxsSG9ybnJlbTBNTCwgZGlyZWN0aW9uID0gJ2JhY2t3YXJkJykKICBzYXZlUkRTKG1vZFRzaW1wSG9ybnJlbTAsIGZpbGUgPSAndGVtcC9tb2RUc2ltcEhvcm5yZW0wLnJkcycpCn0KCnN1bW1hcnkobW9kVHNpbXBKdHVyZW0wKQpzdW1tYXJ5KG1vZFRzaW1wSmJldGFyZW0wKQpzdW1tYXJ5KG1vZFRzaW1wSG9ybnJlbTApCgoKYGBgCgoKIyMgTWFrZSByZWFsbS1zcGVjaWZpYyBtb2RlbHMKYGBge3IgTE1FIEhvcm4gbW9kZWxzIGJ5IHJlYWxtLCBmaWcud2lkdGg9MTAsIGZpZy5oZWlnaHQ9OH0KaTEgPC0gdHJlbmRzWywgUkVBTE0gPT0gJ1RlcnJlc3RyaWFsJyAmIGNvbXBsZXRlLmNhc2VzKEhvcm50cmVuZHJlbTAsIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlZy5zYywgZHVyYXRpb24uc2MsIGh1bWFuX2Jvd2xlci5zYyldCmkyIDwtIHRyZW5kc1ssIFJFQUxNID09ICdGcmVzaHdhdGVyJyAmIGNvbXBsZXRlLmNhc2VzKEhvcm50cmVuZHJlbTAsIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zcHAuc2MsIHRoZXJtYWxfYmlhcy5zYywgbnBwLnNjLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWcuc2MsIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXSAjIG5vIGNvbnN1bWVyZnJhYwppMyA8LSB0cmVuZHNbLCBSRUFMTSA9PSAnTWFyaW5lJyAmIGNvbXBsZXRlLmNhc2VzKEhvcm50cmVuZHJlbTAsIHRlbXBhdmVfbWV0YWIuc2MsIHNlYXMuc2MsIG1pY3JvY2xpbS5zYywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYywgbWFzcy5zYywgc3BlZWQuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyZnJhYy5zYywgbnNwcC5zYywgdGhlcm1hbF9iaWFzLnNjLCBucHAuc2MsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLnNjLCBodW1hbl9ib3dsZXIuc2MpXSAjIG5vIHZlZwoKcHJpbnQocGFzdGUoJ1RlcnJlc3RyaWFsJywgc3VtKGkxKSkpCnByaW50KHBhc3RlKCdGcmVzaHdhdGVyJywgc3VtKGkyKSkpCnByaW50KHBhc3RlKCdNYXJpbmUnLCBzdW0oaTMpKSkKCnJhbmRlZiA8LSBsaXN0KFNUVURZX0lEID0gfiB0ZW1wdHJlbmRfYWJzLnNjLCByYXJlZnlJRCA9IH4xKQp2YXJlZiA8LSB2YXJQb3dlcigtMC41LCB+bnlyQlQpCgojIGxhbmQKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxIb3JuVGVyci5yZHMnKSl7CiAgbW9kVGZ1bGxIb3JuVGVyciA8LSByZWFkUkRTKCd0ZW1wL21vZFRmdWxsSG9yblRlcnIucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEhvcm5UZXJyIDwtIGxtZShIb3JudHJlbmRyZW0wIH4gCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGVtcGF2ZV9tZXRhYi5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzZWFzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm1pY3JvY2xpbS5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptYXNzLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnNwZWVkLnNjICsgCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmNvbnN1bWVyZnJhYy5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKm5zcHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0aGVybWFsX2JpYXMuc2M6dHNpZ24gKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypucHAuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp2ZWcuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypkdXJhdGlvbi5zYyArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKmh1bWFuX2Jvd2xlci5zYywKICAgICAgICAgICAgICAgICAgICAgICByYW5kb20gPSByYW5kZWYsIHdlaWdodHMgPSB2YXJlZiwgZGF0YSA9IHRyZW5kc1tpMSxdLCBtZXRob2QgPSAnUkVNTCcsCiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCA9IGxtZUNvbnRyb2wobWF4SXRlciA9IDEwMCwgbXNNYXhJdGVyID0gMTAwLCBuaXRlckVNID0gNTAsIG1zTWF4RXZhbCA9IDUwMCkpCiAgc2F2ZVJEUyhtb2RUZnVsbEhvcm5UZXJyLCBmaWxlID0gJ3RlbXAvbW9kVGZ1bGxIb3JuVGVyci5yZHMnKQp9CgojIGZyZXNod2F0ZXIKaWYoZmlsZS5leGlzdHMoJ3RlbXAvbW9kVGZ1bGxIb3JuRnJlc2gucmRzJykpewogIG1vZFRmdWxsSG9ybkZyZXNoIDwtIHJlYWRSRFMoJ3RlbXAvbW9kVGZ1bGxIb3JuRnJlc2gucmRzJykKfSBlbHNlIHsKICBtb2RUZnVsbEhvcm5GcmVzaCA8LSBsbWUoSG9ybnRyZW5kcmVtMCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdmVnLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9ib3dsZXIuc2MsCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTIsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kVGZ1bGxIb3JuRnJlc2gsIGZpbGUgPSAndGVtcC9tb2RUZnVsbEhvcm5GcmVzaC5yZHMnKQp9CgojIG1hcmluZQppZihmaWxlLmV4aXN0cygndGVtcC9tb2RUZnVsbEhvcm5NYXIucmRzJykpewogIG1vZFRmdWxsSG9ybk1hciA8LSByZWFkUkRTKCd0ZW1wL21vZFRmdWxsSG9ybk1hci5yZHMnKQp9IGVsc2UgewogIG1vZFRmdWxsSG9ybk1hciA8LSBsbWUoSG9ybnRyZW5kcmVtMCB+IAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyp0c2lnbiArCiAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wdHJlbmRfYWJzLnNjKnRlbXBhdmVfbWV0YWIuc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2Mqc2Vhcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYyptaWNyb2NsaW0uc2MgKyAKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbWFzcy5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypzcGVlZC5zYyArIAogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypjb25zdW1lcmZyYWMuc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypuc3BwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqdGhlcm1hbF9iaWFzLnNjOnRzaWduICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqbnBwLnNjICsKICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXB0cmVuZF9hYnMuc2MqZHVyYXRpb24uc2MgKwogICAgICAgICAgICAgICAgICAgICAgICAgdGVtcHRyZW5kX2Ficy5zYypodW1hbl9ib3dsZXIuc2MsCiAgICAgICAgICAgICAgICAgICAgICAgcmFuZG9tID0gcmFuZGVmLCB3ZWlnaHRzID0gdmFyZWYsIGRhdGEgPSB0cmVuZHNbaTMsXSwgbWV0aG9kID0gJ1JFTUwnKQogIHNhdmVSRFMobW9kVGZ1bGxIb3JuTWFyLCBmaWxlID0gJ3RlbXAvbW9kVGZ1bGxIb3JuTWFyLnJkcycpCn0KCnN1bW1hcnkobW9kVGZ1bGxIb3JuVGVycikKc3VtbWFyeShtb2RUZnVsbEhvcm5GcmVzaCkKc3VtbWFyeShtb2RUZnVsbEhvcm5NYXIpCmBgYAojIyMgUGxvdCB0aGUgcmVhbG0tc3BlY2lmaWMgY29lZmZpY2llbnRzCkFsc28gdXNlcyB0aGUgZnVsbCBtb2RlbHMgYWNyb3NzIGFsbCByZWFsbXMKYGBge3IgcGxvdCByZWFsbSBtb2RzLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9OX0KCmNvZWZzMSA8LSBzdW1tYXJ5KG1vZFRmdWxsSG9ybnJlbTApJHRUYWJsZQpjb2VmczIgPC0gc3VtbWFyeShtb2RUZnVsbEhvcm5UZXJyKSR0VGFibGUKY29lZnMzIDwtIHN1bW1hcnkobW9kVGZ1bGxIb3JuRnJlc2gpJHRUYWJsZQpjb2VmczQgPC0gc3VtbWFyeShtb2RUZnVsbEhvcm5NYXIpJHRUYWJsZQoKdmFyc3RvcGxvdCA8LSB1bmlxdWUoYyhyb3duYW1lcyhjb2VmczEpLCByb3duYW1lcyhjb2VmczIpLCByb3duYW1lcyhjb2VmczMpLCByb3duYW1lcyhjb2VmczQpKSkKdmFyc3RvcGxvdCA8LSB2YXJzdG9wbG90W3doaWNoKCFncmVwbCgnSW50ZXJjZXB0JywgdmFyc3RvcGxvdCkgfCBncmVwbCgnOicsIHZhcnN0b3Bsb3QpKV0gIyB2YXJzIHRvIHBsb3QKCnJvd3MxXzEgPC0gd2hpY2gocm93bmFtZXMoY29lZnMxKSAlaW4lIHZhcnN0b3Bsb3QpICMgcm93cyBpbiBjb2Vmcwpyb3dzMV8yIDwtIHdoaWNoKHJvd25hbWVzKGNvZWZzMikgJWluJSB2YXJzdG9wbG90KQpyb3dzMV8zIDwtIHdoaWNoKHJvd25hbWVzKGNvZWZzMykgJWluJSB2YXJzdG9wbG90KQpyb3dzMV80IDwtIHdoaWNoKHJvd25hbWVzKGNvZWZzNCkgJWluJSB2YXJzdG9wbG90KQp4bGltcyA8LSByYW5nZShjKGNvZWZzMVtyb3dzMV8xLDFdIC0gY29lZnMxW3Jvd3MxXzEsMl0sIGNvZWZzMVtyb3dzMV8xLDFdICsgY29lZnMxW3Jvd3MxXzEsMl0sIAogICAgICAgICAgICAgICAgIGNvZWZzMltyb3dzMV8yLDFdIC0gY29lZnMyW3Jvd3MxXzIsMl0sIGNvZWZzMltyb3dzMV8yLDFdICsgY29lZnMyW3Jvd3MxXzIsMl0sIAogICAgICAgICAgICAgICAgIGNvZWZzM1tyb3dzMV8zLDFdIC0gY29lZnMzW3Jvd3MxXzMsMl0sIGNvZWZzM1tyb3dzMV8zLDFdICsgY29lZnMzW3Jvd3MxXzMsMl0sCiAgICAgICAgICAgICAgICAgY29lZnM0W3Jvd3MxXzQsMV0gLSBjb2VmczRbcm93czFfNCwyXSwgY29lZnM0W3Jvd3MxXzQsMV0gKyBjb2VmczRbcm93czFfNCwyXSkpCgoKY29scyA8LSBicmV3ZXIucGFsKDQsICdEYXJrMicpICMgZm9yIGZ1bGwsIHRlcnIsIGZyZXNoLCBtYXIKcGNocyA8LSBjKDEsIDE2LCAxNiwgMTYpCm9mZnMgPC0gYygwLjEsIDAsIC0wLjEsIC0wLjIpICMgb2Zmc2V0IHZlcnRpY2FsbHkgZm9yIGVhY2ggbW9kZWwKCgpwYXIobGFzID0gMSwgbWFpID0gYygwLjUsIDQsIDAuMSwgMC4xKSkKCnBsb3QoMCwwLCBjb2wgPSAnd2hpdGUnLCB4bGltID0geGxpbXMsIHlsaW0gPSBjKDEsbGVuZ3RoKHZhcnN0b3Bsb3QpKSwgeWF4dD0nbicsIHhsYWIgPSAnJywgeWxhYiA9JycpCmF4aXMoMiwgYXQgPSBsZW5ndGgodmFyc3RvcGxvdCk6MSwgbGFiZWxzID0gdmFyc3RvcGxvdCwgY2V4LmF4aXMgPSAwLjcpCmFibGluZSh2ID0gMCwgY29sID0gJ2dyZXknLCBsdHkgPSAyKQphYmxpbmUoaCA9IDE6bGVuZ3RoKHZhcnN0b3Bsb3QpLCBjb2wgPSAnZ3JleScsIGx0eSA9IDMpCmZvcihpIGluIDE6bGVuZ3RoKHZhcnN0b3Bsb3QpKXsKICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMxKSl7CiAgICB4ID0gY29lZnMxW3Jvd25hbWVzKGNvZWZzMSkgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMxW3Jvd25hbWVzKGNvZWZzMSkgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMV0sIHBjaCA9IHBjaHNbMV0sIGNvbCA9IGNvbHNbMV0pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzFdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMV0pLCBjb2wgPSBjb2xzWzFdKQogIH0KICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMyKSl7CiAgICB4ID0gY29lZnMyW3Jvd25hbWVzKGNvZWZzMikgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMyW3Jvd25hbWVzKGNvZWZzMikgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMl0sIHBjaCA9IHBjaHNbMl0sIGNvbCA9IGNvbHNbMl0pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzJdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbMl0pLCBjb2wgPSBjb2xzWzJdKQogIH0KICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnMzKSl7CiAgICB4ID0gY29lZnMzW3Jvd25hbWVzKGNvZWZzMykgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnMzW3Jvd25hbWVzKGNvZWZzMykgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbM10sIHBjaCA9IHBjaHNbM10sIGNvbCA9IGNvbHNbM10pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzNdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbM10pLCBjb2wgPSBjb2xzWzNdKQogIH0KICBpZih2YXJzdG9wbG90W2ldICVpbiUgcm93bmFtZXMoY29lZnM0KSl7CiAgICB4ID0gY29lZnM0W3Jvd25hbWVzKGNvZWZzNCkgPT0gdmFyc3RvcGxvdFtpXSwgMV0KICAgIHNlID0gY29lZnM0W3Jvd25hbWVzKGNvZWZzNCkgPT0gdmFyc3RvcGxvdFtpXSwgMl0KICAgIHBvaW50cyh4LCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbNF0sIHBjaCA9IHBjaHNbNF0sIGNvbCA9IGNvbHNbNF0pCiAgICBsaW5lcyh4ID0gYyh4LXNlLCB4K3NlKSwgeSA9IGMobGVuZ3RoKHZhcnN0b3Bsb3QpICsgMSAtIGkgKyBvZmZzWzRdLCBsZW5ndGgodmFyc3RvcGxvdCkgKyAxIC0gaSArIG9mZnNbNF0pLCBjb2wgPSBjb2xzWzRdKQogIH0KfQpsZWdlbmQoJ2JvdHRvbWxlZnQnLCBjb2wgPSBjb2xzLCBwY2ggPSBwY2hzLCBsd2QgPSAxLCBsZWdlbmQgPSBjKCdBbGwnLCAnVGVyZXN0cmlhbCcsICdGcmVzaHdhdGVyJywgJ01hcmluZScpKQpgYGAKCltFbmQgdGV4dCBpbiBob3BlcyB0aGlzIGhlbHBzIHRoZSBsYXN0IGZpZ3VyZSBzaG93IHVwIHdoZW4ga25pdHRlZF0=